はじめての C
[Learning GNU C]
第10章 C プリプロセッサ
いつ どのように 使うか
10.1. プリプロセッサとは なにか
C プリプロセッサは コンパイラに 渡す前に ソースコード上で 走らせる 簡単な マクロの 拡張のことだ。 ハッシュ記号 '#' から 始まる 行で プリプロセッサに 指令する。
C の 式で ある名前を 割り当てる マクロを つくると ちょうど その式で 使われたように その名前を コードで 使うことが できる。 プリプロセッサは (当てはまった) 名前の 全てを その式と 取り換える。
10.2. なんのために 使うか?
マクロは コンパイルする 前の 過程で 与えられる コードの 断片だ。"#define statements (命令文)" という マクロが C プリプロセッサにより 実行される。 1つ コードを 見てみよう、
Example 10-1. box_of_stars.c
#define SIZE_OF_SQUARE 4int
main()
{
int i, j;
for (i = 0; i < SIZE_OF_SQUARE; i++) {
for (j = 0; j < SIZE_OF_SQUARE; j++)
printf("*"); // 各列 each row に アスタリスクを 表示
printf("\n"); // 各列の 終わりで 改行
}
return 0;
}
このコードの 出力は 長方形 box に なる。
****
****
****
****
C プリプロセッサは 単に マクロの SIZE_OF_SQUARE を 4 の値と 取り換える。 これは 2つの 理由から とても 役立つ。
1つは、行を 編集するだけで 長方形の サイズを 変更することが できる。 例題だと SIZE_OF_SQUARE を2度 使うだけなので 大きな 利点は ないが より大きな プログラムでは これで 管理 life は より 簡単になり 値の 変換を 忘れる 可能性が とり除かれる。
2つ目は、コードを より 読みやすくし 例えば 値に "#define PI 3.14285713" のように 意味のある 名前を つけることが できる。
10.3 いくつかの マクロ サンプル
glibc の いくつかの 小さな 関数は マクロで 実装され getc() は その 1つだ。