C のプリプロセッサには、ソースコードの一部を選択的にコンパイルできるようにするディレクティブがある。そういうディレクティブを使ったコンパイル方法を条件付きコンパイル(conditional compilation)という。条件付きコンパイルのためのディレクティブは次のとおり。
- #if
- #else
- #elif
- #endif
- #ifdef
- #ifndef
#if から #endif までは、要するに if 文と一緒だ。一般的な形式は次のとおり。
#if 定数式1 文の並び #elif 定数式2 文の並び #elif 定数式3 文の並び #else 文の並び #endif
定数式は真の時だけ、文の並びかコンパイルされる。ここで注意が必要なのは、定数式の部分に変数は使えないこと。プリプロセッサがこれを処理するときにはまだ変数が使えないからだ。
条件付きコンパイルのもうひとつの方法として、#ifdef あるいは #ifndef をつかつ方法がある。
#ifdef マクロ名 文の並び #endif
#ifdef はマクロ名が定義されているときだけ、文の並びをコンパイルする。#ifndef はその逆に定義されていないときにコンパイルする。
次のプログラムは、#if #else #endif を使った例。マクロ CHAR_SET の値によって、コンパイルする文が変わる。
#include #define CHAR_SET 128 int main(void) { int i; #if CHAR_SET == 256 printf("ASCII and other characters.\n"); #else printf("Only ASCII characters.\n"); #endif for (i = 0; i < CHAR_SET; i++) { printf("%c", i); } printf("\n"); return 0; }
takatoh@nightschool $ ./sample_12_2 Only ASCII characters. !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
#define CHAR_SET の値を 256 に変えると出力は接ぎのように変わる。
takatoh@nightschool $ ./sample_12_2 ASCII and other characters. !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~������������������������������������������������������������������������������������������������������������������������������
なんか表示できない文字が多いけど、出力が、ということはコンパイル内容が変わっていることはわかる。