C++で#ifdef/#if defined/#elseを利用する方法
C++で#ifdef/#if defined/#elseを利用する方法を紹介します。
1.問題点
下記のサンプルコードがあります。
test.cpp
#include <stdio.h>
int main(void) {
#ifdef TEST
printf("test\n");
#else
printf("no test\n");
#endif
return 0;
}
ビルドと実行で、
% g++ test.cpp
% ./a.out
no test
となります。
このコードで、
printf("test\n");
の行を通過させたいのですが、方法がわかりません。
ということで、C++で#ifdef/#if defined/#elseを利用する方法を紹介します。
ちなみに"#ifdef"の部分は、下記のように"#if defined()"に置き換えることもできます。
#include <stdio.h>
int main(void) {
#if defined(TEST)
printf("test\n");
#else
printf("no test\n");
#endif
return 0;
}
2.#ifdef/#if defined/#elseを利用する
#ifdef/#if defined/#elseを利用するには、gccに"-D"オプションを適用します。
"-D"はプリプロセッサオプション(コンパイルする前に、Cプリプロセッサにかけられる)で、フォーマットは、
-Dmacro
または、
-Dmacro=defn
のいずれかになります。
これは"-D"の後方にあるmacro(マクロ)の有効・無効を指定するもので、有効であれば、"#ifdef/#if defined()"で括られた部分がコンパイル対象になり、そうでなければ"#else"で括られた部分がコンパイル対象になります(#elseがなければコンパイル対象なし)。
上記のサンプルであれば、マクロが"TEST"なので、
% g++ -DTEST test.cpp
としてビルド・実行すれば、マクロ"TEST"が有効となるので、
printf("test\n");
がコンパイル対象となり、結果、この行を通過します。
% g++ test.cpp
としてビルド・実行すれば、マクロ"TEST"は無効なので、
printf("no test\n");
がコンパイル対象となり、結果、この行を通過します。
Posted by yujiro このページの先頭に戻る
トラックバックURL
コメントする
greeting