プリプロセッサ条件分岐

プリプロセッサは、条件分岐の構文を持っています。

#ifdef - マクロが定義されていたら

あるマクロが定義されていたらは「#ifdef」で表現できます。

#ifdef マクロ名

// 処理

#endif

「#ifdef」のサンプルです。

#include <stdio.h>

#define MYAPP_FOO

int main(void) {

#ifdef MYAPP_FOO
  printf("Hello\n");
#endif

}

#defineで「MYAPP_FOO」というマクロが定義されている場合は「Hello」が出力され、この行を取り除くと、何も出力されません。

#ifndef - マクロが定義されていなかったら

あるマクロが定義されていなかったら、は「#ifndef」で表現できます。

#ifndef マクロ名

// 処理

#endif

「#ifndef」はインクルードガードを書くときによく使います。

「#ifndef」のサンプルです。

#include <stdio.h>

int main(void) {

#ifndef MYAPP_FOO
  printf("Hello\n");
#endif

}

#defineで「MYAPP_FOO」というマクロが定義されていなかった場合は、「Hello」が出力され、定義されていると、何も出力されません。

#if - 条件がみたされたら

条件がみたされた場合の処理を「#if」で記述することができます。比較演算子、否定演算子、definedが使えます。比較演算は、整数定数のみで行えます。比較演算でマクロが定義されていなかった場合は、値は0とみなされます。

#if 条件

// 処理

#endif

「#if」のサンプルです。

#include <stdio.h>

#define MYAPP_FOO 5

int main(void) {

#if defined(MYAPP_FOO)
  printf("MYAPP_FOO is defined\n");
#endif

#if !defined(MYAPP_FOO)
  printf("MYAPP_FOO is not defined\n");
#endif

#if defined(MYAPP_FOO)
#  if MYAPP_FOO > 3
  printf("MYAPP_FOO is defined and greater than 3\n");
#  endif
#endif
}

#elif, #else

「#elif」で複数条件、「#else」で条件が成り立たなかった場合の処理がかけます。

#include <stdio.h>

#define MYAPP_FOO 5

int main(void) {

#if MYAPP_FOO > 10
  printf("MYAPP_FOO is greater than 10\n");
#elif MYAPP_FOO > 3
  printf("MYAPP_FOO is greater than 3\n");
#else
  printf("MYAPP_FOO is others\n");
#endif
}

比較演算子でsizeof演算子は使えないのですか?

はい、プリプロセッサの比較演算子では、sizeof演算子を、使うことができません。

このことは、原理的に32bitや64bitの判定をプリプロセッサを使って行うことができないことを意味しています。

C言語の外側からマクロ定義として与える必要があります。

またすでに判定するためのマクロ定義が与えられていた場合は、それを利用できます。たとえばgccで32bitを判定する場合の例。

#include <stdio.h>

int main() {
#ifdef __code_model_32__

#else

#endif
}

関連情報