Share via


致命的なエラー 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 と評価されます。 式 #ifCONSTANT_NAME は false と評価され、YES で使用するコードはプリプロセッサによって削除されます。 NO も未定義 (ゼロ) なので、#elifCONSTANT_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 を使用します。