条件付きコンパイル

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{|}~������������������������������������������������������������������������������������������������������������������������������

なんか表示できない文字が多いけど、出力が、ということはコンパイル内容が変わっていることはわかる。