マクロ展開


さて、C のプログラムは、マクロといわれるものを展開するために、 preprocessor というものにかけられます。 先ほどの例だと、赤いところが マクロ関連のところです。
#include <stdio.h>
#define MAIN_RVAL 0

int main() {
    printf("hello, world\n");
    return MAIN_RVAL;
}
一行目は、"stdio.h" というファイルを読込むためのものです。 stdio.h は、標準的な I/O に関する関数宣言、変数宣言をおこうためのヘッダファイルです。 この場合、printf()を利用するにあたり、その関数宣言をとりこもうとしているわけです。 で、stdio.h 自体は、 例えば、"/usr/include/stdio.h" という場所にあったりします。 一度、実際にみてみると良いでしょう。 というわけで、マクロ展開をすると、行の先頭の方に stdio.h (とそこからさらに include されたファイル達)がずらずらと挿入されます。

もう一つの MAIN_RVAL というのは、マクロ変数 MAIN_RVAL に関するもので、 2 行目では、MAIN_RVAL は 0 で置き換えるというルールを記述しており、 実際に、6 行目の MAIN_RVAL という文字列は 0 で置き換えられることになります。

gcc に途中経過をファイルにおとしたければ、

kamada@cygwin% gcc -E hello.c > hello.E 
としておけばいいでしょう。こんな感じになります。 ファイルの中を文字列サーチしてもらえば、printf のプロトタイプ宣言が挿入されていることが 分かるでしょう。 また、最後の最後に main 関数が書かれていますが、そのなかで、MAIN_RVAL が 0 に置き換えられている のも分かるでしょう。

2001.9.25/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp