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 #ifdirettiva , #elifo #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.