致命的なエラー C1017
整数定数式が無効です。
#if
ディレクティブ内の式が存在していないか、定数と評価されませんでした。
#define
を使用して定義される定数は、#if
、#elif
、または #else
ディレクティブで使用される場合に整数定数に評価される値を持つ必要があります。
次の例では C1017 が生成されます。
// C1017.cpp
#define CONSTANT_NAME "YES"
#if CONSTANT_NAME // C1017
#endif
考えられる解決方法:
// C1017b.cpp
// compile with: /c
#define CONSTANT_NAME 1
#if CONSTANT_NAME
#endif
CONSTANT_NAME
は整数ではなく文字列と評価されるので、#if
ディレクティブでは致命的なエラー C1017 が生成されます。
それ以外の場合、プリプロセッサでは未定義の定数が 0 として評価されます。 これにより、次の例に示すように、意図しない結果が発生する可能性があります。 YES
は未定義なので、0 と評価されます。 式 #if
CONSTANT_NAME
の評価の結果は false となり、YES
のときに使用されるコードはプリプロセッサによって削除されます。 NO
も未定義 (ゼロ) であり、したがって #elif
CONSTANT_NAME==NO
の評価の結果は true となるため (0 == 0
)、プリプロセッサによる処理ではステートメントの #elif
部分のコードがそのままになります。つまり、意図した動作とはまったく逆です。
// C1017c.cpp
// compile with: /c
#define CONSTANT_NAME YES
#if CONSTANT_NAME
// Code to use on YES...
#elif CONSTANT_NAME==NO
// Code to use on NO...
#endif
コンパイラがプリプロセッサ ディレクティブを処理する方法を正確に確認するには、/P、/E、または /EP を使用します。