Errore irreversibile C1017
espressione costante integer non valida
L'espressione in una #if
direttiva non esiste o non ha restituito una costante.
Le costanti definite tramite #define
devono avere valori che restituiscono una costante integer se vengono usate in una #if
direttiva , #elif
o #else
.
L'esempio seguente genera l'errore C1017:
// C1017.cpp
#define CONSTANT_NAME "YES"
#if CONSTANT_NAME // C1017
#endif
Possibile soluzione:
// C1017b.cpp
// compile with: /c
#define CONSTANT_NAME 1
#if CONSTANT_NAME
#endif
Poiché CONSTANT_NAME
restituisce una stringa e non un numero intero, la #if
direttiva genera un errore irreversibile C1017.
In altri casi, il preprocessore valuta una costante non definita come zero. Ciò può causare risultati imprevisti, come illustrato nell'esempio seguente. YES
non è definito, quindi restituisce zero. L'espressione #if
CONSTANT_NAME
restituisce false e il codice da usare in YES
viene rimosso dal preprocessore. NO
è anche indefinito (zero), quindi #elif
CONSTANT_NAME==NO
restituisce true (0 == 0
), causando il preprocessore di lasciare il codice nella #elif
parte dell'istruzione , esattamente l'opposto del comportamento previsto.
// 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
Per vedere esattamente come il compilatore gestisce le direttive del preprocessore, usare /P, /E o /EP.