2005 年度「計算数学1」 2005-06-01 おまけ

このページはプリントにはしません。

#ifdef, #else, #endif の使い方、コンパイラオプション

下の例では、#define JAPANESE が前にあるので、 #ifdef JAPANESE#else の間はコンパイルされ、 #else#endif の間はコンパイルされない (=コメントのように無視される)。 #define JAPANESE を消してからコンパイルすれば、こんどは #ifdef JAPANESE#else の間は無視され、 #else#endif の間がコンパイルされる。 (#define JAPANESE を消すと言ったが、 一行まるごと消す必要はない。例えば行末の E 一文字を消せば、 #define されているのは JAPANES であって JAPANESE ではなくなるから、それでよい。)

#include <stdio.h>

#define JAPANESE

main() {
#ifdef JAPANESE
    printf("今日は, 世界\n");   /* ここはコンパイルされる */
#else
    printf("hello, world\n");   /* ここは無視される */
#endif
}

よく使うテクニックは、 #define DEBUG と書いて、 デバッグ(=プログラムのミスを見出す作業)時だけ、 途中経過を出力させたり、 特別なメッセージを出力させたりすることである。

なお、 「gcc kadai6.c」の代わりに 「gcc -DDEBUG kadai6.c」としてコンパイルすると、 ソースファイル中に「#define DEBUG」がなくても、 これを書いたのと同じ効果がある。 (このオプションは -D に続けて DEBUG を書いたものである。 -D#define に因むものと思われる。 D の字が二つ続くが、間違いではない。 また、こういったオプションは、 コンパイラ特有のものであるので一般にはコンパイラによって異なるが、 -D は多くのコンパイラに共通のようである。)

さらに、 「gcc -DN=1000 kadai6.c」のようなコンパイルのしかたもある。 これは、「#define N 1000」とプログラム中に書いたのと同じである。

これらのオプションをつけてコンパイルするプログラムは、 冒頭にそのことをコメントとして書いておくべきである。 そうでないと、 あとで忘れてしまった場合にコンパイルできなくなる可能性もある。


岩瀬順一