#error
#error エラーメッセージ
プリプロセッサは #error ディレクティブを見つけるとコンパイルを中断する。
#include
int main(void)
{
int i;
i = 10;
#error This is an error message.
printf("%d\n", i); /* This line is NOT compiled */
return 0;
}
takatoh@nightschool $ gcc sample_12_3a.c -o sample_12_3a
sample_12_3a.c: In function ‘main’:
sample_12_3a.c:10:2: error: #error This is an error message.
#error This is an error message.
^
#error ディレクティブは主にデバッグ目的で使われる。
#undef
#undef マクロ名
#undef ディレクティブはマクロ名の定義を解除する。マクロ名が定義されていなければなんの効力もない。#undef は主にマクロ名の効果を局所的に限定するためにある。
#include
#define DOG
int main(void)
{
#ifdef DOG
printf("DOG is defined.\n");
#endif
#undef DOG
#ifdef DOG
printf("This line is NOT compiled.\n");
#endif
return 0;
}
takatoh@nightschool $ ./sample_12_3b
DOG is defined.
#line
C のコンパイラは、コンパイルの最中、現在コンパイルしているファイル名と行番号を保持している。#line ディレクティブを使うと、これらの値を変更することができる。一般的な形式は次のとおり。
#line 行番号 "ファイル名"
主にデバッグや大規模プロジェクトの管理に使用する、と本には書いてあるけど、ユースケースが思い浮かばない。
#include
int main(void)
{
int i;
#line 1000 "myprog.c"
#error Check the line number and file name.
return 0;
}
takatoh@nightschool $ gcc sample_12_3c.c -o sample_12_3c
myprog.c: In function ‘main’:
myprog.c:1000:2: error: #error Check the line number and file name.
確かに行番号やファイル名が #line ディレクティブで指定した値になっている。
#pragma
#pragma 命令
本には「#pragma ディレクティブを使うと、コンパイラに渡すプリプロセッサディレクティブを、コンパイラの実装者が定義することができます。」と書いてある。これって、コンパイラを使うプログラマには使い道がないんじゃ……。