7-4 <発展> 定義済みマクロ

この記事は約4分で読めます。

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

処理系によってはこれら以外も定義済みマクロが存在しますが、ほとんど用いられません。

コメント

タイトルとURLをコピーしました