#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 ディレクティブを使うと、コンパイラに渡すプリプロセッサディレクティブを、コンパイラの実装者が定義することができます。」と書いてある。これって、コンパイラを使うプログラマには使い道がないんじゃ……。