プリプロセッサによりある種の言語仕様が与えられる。
■ファイルのインクルード
以下のようにすると、自身のファイルの場所から探索が始まる。
#include "filename"
以下のようにすると、コンパイラの規則に従った探索が行われる。stdio.hなどは以下の方法でインクルードする。
#include <filename>
■マクロ
#define NAME VALUE
NAMEとVALUEは任意であり以下のようにすることもできる。
#define forever for(;;)
以下のようにすることで使用できる。
int main (int argc, const char * argv[]) { forever printf("hogehoge\n"); }
永久にhogehogeが表示される。また、以下のように関数を定義することもできる
#define max(a, b) (a > b)? (a) : (b) int main (int argc, const char * argv[]) { int d = max(1, 2); printf("こんにちは!%d円よこしてください\n", d); }
内部では以下のようにインライン展開されている。
x = ((p + q) > (r + s))? (p + q) : (r + s);
以下のような場合は注意する必要がある。
#define sq(x) x * x int main (int argc, const char * argv[]) { int z = 3; sq(z + 1);// 7 = z + 1 * z + 1 = 3 + 1 * 3 + 1 sq((z + 1));// 16 }
以下のようにすることで正しい結果が期待できる。
#define sq(x) (x) * (x)
■未定義
以下のようにして未定義にすることができる。
#undef hello void hello() {}
■条件付き取り込み
以下のようにすることで条件に応じた処理をすることができる。
#if !defined(INCLUDED_MAIN) define INCLUDED_MAIN int hoge(); #endif
インクルードガードとかでも使う。