Allvarligt fel C1017

ogiltigt heltalskonstantuttryck

Anmärkningar

Uttrycket i ett #if-direktiv existerade inte eller utvärderades inte som en konstant.

Konstanter som definieras med #define måste ha värden som utvärderas till en heltalskonstant om de används i ett #if, #elif eller #else-direktiv.

Exempel

I följande exempel genereras C1017:

// C1017.cpp
#define CONSTANT_NAME "YES"
#if CONSTANT_NAME   // C1017
#endif

Möjlig lösning:

// C1017b.cpp
// compile with: /c
#define CONSTANT_NAME 1
#if CONSTANT_NAME
#endif

Eftersom CONSTANT_NAME utvärderas till en sträng och inte ett heltal #if genererar direktivet det allvarliga felet C1017.

I andra fall utvärderar förprocessorn en odefinierad konstant som noll. Detta kan orsaka oavsiktliga resultat, som du ser i följande exempel. YES är odefinierat, så det utvärderas till noll. Uttrycket #ifCONSTANT_NAME utvärderas till false och koden som ska användas på YES tas bort av förprocessorn. NO är också odefinierad (noll), så #elifCONSTANT_NAME==NO utvärderas till sant (0 == 0), vilket gör att förprocessorn lämnar koden i #elif delen av -instruktionen – precis motsatsen till det avsedda beteendet.

// 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

Om du vill se exakt hur kompilatorn hanterar förprocessordirektiv använder du /P, /E eller /EP.