プリプロセッサ命令について

最終更新日:2004-07-19.

今回は、プリプロセッサが処理するときの命令をちょっと。
エディタなどでソースを書いてからコンパイルしてプログラムを作るとき、
いくつかの段階があります。

まずはプリプロセッサ。
ソース中の「#」で始まる行を処理します。
また、コメント部分を削除します。

#include は、その後に指定したファイルから内容を読み込みます。
ここにはヘッダファイルなどを指定します。

#define は、マクロ名とマクロを指定します。
ソース中のマクロ名をマクロに置き換えます。

#undef は、その後に指定したマクロ名の置き換えを中止します。

#if #else #endif は、条件判断を行ってから
条件に一致した部分をコンパイルします。

#ifdef #ifndef #endif は、該当のマクロがあるかどうかを判断してから
コンパイルを行います。

#typedef は、指定した二つの引数を同じものとみなします。

これらは、コンパイルを行う前に実行される処理です。
膨大で複雑なソースを書いているとき、これらをうまく使用すると
ソースの修正などが楽に行えます。
また、条件によるコンパイルでは、該当しない部分が
コンパイルされないことでエラーが発生することもあります。
ソースを書く際には注意しましょう。

では、ソースにしてみましょう。
+------------------------------------------------------------+
/* filename=no033-1.c */
/* include */
#include <stdio.h>
/* define */
#define MESSAGE printf("メッセージです。\n")
#define DOSV 1
/* main */
int main( )
{
#ifdef MESSAGE
printf("#ifdefが実行されました。\n");
MESSAGE;
#endif
#ifndef MESSAGE
printf("#ifndefが実行されました。\n");
printf("MESSAGEマクロは定義されていません。\n");
#endif
#undef MESSAGE
printf("#undef MESSAGE\n");
#ifdef MESSAGE
printf("#ifdefが実行されました。\n");
MESSAGE;
#endif
#ifndef MESSAGE
printf("#ifndefが実行されました。\n");
#endif
#if DOSV
printf("#ifが実行されました。\n");
#else
printf("#elseが実行されました。\n");
#endif
return 0;/* 終了 */
}
+------------------------------------------------------------+

上記をコンパイルして実行すると、以下のように表示されました。
#ifdefが実行されました。
メッセージです。
#undef MESSAGE
#ifndefが実行されました。
#ifが実行されました。

戻る