C言語にはコンパイラによって定義されるマクロが存在します。ヘッダファイルで定義されるマクロとは違い、コンパイル時の状態によって値が変化します。
代表的な定義済マクロ
マクロ名 | 意味 | 例 |
__LINE__ | 行番号 | 10 |
__FILE__ | ファイル名 | “main.c” |
__DATE__ | コンパイル時の日付 | “Jan 1 2022” |
__TIME__ | コンパイル時の時刻 | “12:00:00” |
処理系によって実装状況が異なるマクロ
マクロ名 | 意味 | 例 |
__FUNC__ | 関数名 | “main” |
__FUNCTION__ | 上記と同じ | “main” |
__STDC_VERSION__ | 処理系が実装するC言語の規格 | 201710 |
__TIMESTAMP__ | ソースファイルの保存日時 | “Sat Jan 1 12:00:00 2022” |
これらは処理系によって定義されていない場合があるので注意が必要です。下のコードでは、#ifdefを用いています。
#include <stdio.h>
int main(void){
printf("__LINE__=%d\n",__LINE__);
printf("__FILE__=%s\n",__FILE__);
printf("__DATE__=%s\n",__DATE__);
printf("__TIME__=%s\n",__TIME__);
#ifdef __FUNC__
printf("__FUNC__=%s\n",__FUNC__);
#endif
#ifdef __FUNCTION__
printf("__FUNCTION__=%s\n",__FUNCTION__);
#endif
#ifdef __STDC_VERSION__
printf("__STDC_VERSION__=%ld\n",__STDC_VERSION__);
#endif
#ifdef __TIMESTAMP__
printf("__TIMESTAMP__=%s\n",__TIMESTAMP__);
#endif
return 0;
}
実行結果 Borland C++ 5.5.1
__LINE__=3
__FILE__=main.c
__DATE__=Mar 24 2022
__TIME__=21:18:15
__FUNC__=main
実行結果 Embarcadero C++ 7.30
__LINE__=3
__FILE__=main.c
__DATE__=Mar 24 2022
__TIME__=21:22:44
__FUNC__=main
__STDC_VERSION__=199901
__TIMESTAMP__=Thu Mar 24 21:17:42 2022
実行結果 VS2022 /std:c17
__LINE__=3
__FILE__=C:\Users\gukos\Documents\Visual Studio 2022\Projects\test\test.c
__DATE__=Mar 24 2022
__TIME__=21:25:29
__FUNCTION__=main
__STDC_VERSION__=201710
__TIMESTAMP__=Thu Mar 24 21:25:29 2022
#lineを使用すると、定義済みマクロの値を変えることができます。
#line 行番号 ファイル名
行番号およびファイル名を変更できます。
#include <stdio.h>
int main(void){
printf("ファイル名:%s,行番号:%d\n",__FILE__,__LINE__);
printf("ファイル名:%s,行番号:%d\n",__FILE__,__LINE__);
#line 10
printf("ファイル名:%s,行番号:%d\n",__FILE__,__LINE__);
#line 20 "test.c"
printf("ファイル名:%s,行番号:%d\n",__FILE__,__LINE__);
printf("ファイル名:%s,行番号:%d\n",__FILE__,__LINE__);
return 0;
}
実行結果
ファイル名:main.c,行番号:4
ファイル名:main.c,行番号:5
ファイル名:main.c,行番号:10
ファイル名:test.c,行番号:20
ファイル名:test.c,行番号:21
処理系によってはこれら以外も定義済みマクロが存在しますが、ほとんど用いられません。
コメント