プリプロセッサ

#include とか #define などはすでに何回もプログラムに登録していますが、これらはコンパイラが本格的に翻訳を始める前に処理されます。この処理を行うプログラムをプリプロセッサ (preprocessor)と呼びます。

#include <ファイル名>

#include "ファイル名"

これかは、ファイル名で指定されたファイルをそっくりそのままソースファイルに取り込みます。< > と使うと、コンパイラが指定した場所にファイルを探しに行きます。 " " を使うと、通常、ソースファイルのあるディレクトリを探し(コンパイラにより異なる)、なければコンパイラを指定した場合を探します。

自分で作ったヘッダファイルには " " を使い、stdio.h のような既存のヘッダファイルには < > を使うと覚えておきましょう。

#define マクロ名 文字列

は、ソースファイル中から「マクロ名」を探して「文字列」に置き換えます。

「#define NO 5」と書くと、ソースファイル中の NO を5に置き換えます。単純な置き換えですが、この機能は強力です。

この置き換えを関数形式で行った場合、関数形式マクロと呼ぶことがありません。

#define KAKEZAN(x,y) ((x)*(y))

とすると、KAKEZAN(2,3)が「2 * 3」に置き換わります。注意すべき点は、(x),(y)というようにかっこをつけないと困ったことが起こりうる点です。

「#define KAKEZAN(x,y) (x * y)」とすると、

int a = 2, b = 3, c = 4, d = 5, e;

e = KAKEZAN(a + b, c + d);

はどうなるでしょうか。a + b は5、c + dは9なので

e = (5 * 9);

e = 45; となり、e に45が代入されることを期待されるのではないでしょうか。しかし、

「e = (a + b * c + d);」となります。つまり、

e = (2 + 3 * 4 + 5);

e = 19; となります。

#define 文字列 ...... (1)

といった使い方もあります。そして、これと組み合わせて

#ifdef 文字列

......

#endif

の組み合わせでつかいます。(1)のように文字列が定義されていると、#ifdef と #endif の間の部分がコンパイルされます。(1)の定義がなければ #ifdef ~ #endif の部分は無視されます。また、これとは逆に

#ifndef 文字列

#endif

の組み合わせもあります。これは、文字列が定義されていないとき #ifndef ~ #endif の部分がコンパイルされます。

#undef は #define 定義を無効にします。

#pragma 独自命令

というのもあります。コンパイラにより独自命令は異なります。ま、このくらい知っていればあまり不自由はしません。

Chapter10 @ C言語目録 @ HomeWork List @ 昭亮's Homepage