I-14-6. マクロの利用(プリプロセッサ機能)

Cコンパイラにおけるプリプロセッサの位置づけと、プリプロセッサが備えている機能を説明する。また、マクロによるプログラミング例を紹介し、マクロの効果的な使い方とマクロ利用時の留意点について解説する。

【学習の要点】

* プリプロセッサとは、コンパイルの前処理をするプログラムである。

* プリプロセッサを用いれば、文字列の置換や条件付きコンパイル、外部ファイルの挿入などができる。

* プリプロセッサ用の構文はCの構文とは別物なので、その扱いには注意しなければならない。

図I-14-6. プリプロセッサに通す前と後

【解説】

1) Cコンパイラにおけるプリプロセッサの位置づけ

プリプロセッサとは、コンパイルの前に実行し、ソースコードに変更を加えるプログラムである。Cでは、#から始まる行がプリプロセッサへの指示となっている。

2) プリプロセッサが備える機能

プリプロセッサが備える機能の一部を紹介する。

* マクロ

「#define」命令により、マクロを定義できる。例えば、次のコマンドにより、プリプロセッサはソースコード中のすべての「PI」という文字列を「3.14」に置き換える。

例) #define PI 3.14

* 条件付きコンパイル

デバッグ用のコードをプログラムに埋め込み、出荷時には取り除きたい場合には、条件付きコンパイル #ifdef/#endif を用いる。

例)

#define DEBUG

#ifdef DEBUG

printf ("ステータスは%d\n", status);

#endif

デバッグ中はプログラム先頭にマクロDEBUGを定義しておくと、変数statusが表示される。

#undef DEBUG

#ifdef DEBUG

printf ("ステータスは%d\n", status);

#endif

とマクロDEBUGを未定義に変えると、#ifdef~#endifの間はコンパイル対象から外れる。

* インクルードファイル

#include命令を使用すると、プログラム中で別のファイルのソースコードを挿入できる。マクロ定義を複数のファイルで共通に使いたい場合などに用いる。

3) マクロ利用時の留意点

プリプロセッサとコンパイラとはソースコードの解釈が異なるので、プリプロセッサ命令中でC言語の構文は使えないことに注意する必要がある。また、プリプロセッサは適切なCの構文であるかどうかをチェックしないため、特にマクロで書き換えたため予期せぬ問題が生じることがあることにも注意が必要である。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。