はじめての 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 4

int
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つだ。