Schwerwiegender Fehler C1017

Ungültiger Ausdruck für Ganzzahlkonstante

Der Ausdruck in einer #if Direktive war nicht vorhanden oder wurde nicht als Konstante ausgewertet.

Konstanten, die mithilfe von "Using #define " definiert werden, müssen Werte aufweisen, die als ganze Konstante ausgewertet werden, wenn sie in einer #if, #elifoder #else direktiven Anweisung verwendet werden.

Im folgenden Beispiel wird C1017 generiert:

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

Mögliche Lösung:

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

Da CONSTANT_NAME eine Zeichenfolge und keine ganze Zahl ausgewertet wird, generiert die #if Direktive einen schwerwiegenden Fehler C1017.

In anderen Fällen wertet der Präprozessor eine nicht definierte Konstante als Null aus. Dies kann zu unbeabsichtigten Ergebnissen führen, wie im folgenden Beispiel gezeigt. YES ist nicht definiert, sodass sie als Null ausgewertet wird. Der Ausdruck #ifCONSTANT_NAME wertet auf "false" aus, und der code, für den er verwendet YES werden soll, wird vom Präprozessor entfernt. NO ist auch nicht definiert (Null), ergibt sich also #elifCONSTANT_NAME==NO als wahr (0 == 0), wodurch der Präprozessor den Code im #elif Teil der Anweisung belassen wird – genau das Gegenteil des beabsichtigten Verhaltens.

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

Um genau zu sehen, wie der Compiler Präprozessordirektiven behandelt, verwenden Sie /P, /E oder /EP.