Error irrecuperable C1017
expresión constante de tipo entero no válida
La expresión de una directiva #if
no existía o no se ha evaluado como una constante.
Las constantes definidas con #define
deben tener valores que se evalúen como una constante de tipo entero si se usan en una directiva #if
, #elif
o #else
.
El ejemplo siguiente genera el error C1017:
// C1017.cpp
#define CONSTANT_NAME "YES"
#if CONSTANT_NAME // C1017
#endif
Posible solución:
// C1017b.cpp
// compile with: /c
#define CONSTANT_NAME 1
#if CONSTANT_NAME
#endif
Dado que CONSTANT_NAME
se evalúa como una cadena y no un entero, la directiva #if
genera el error irrecuperable C1017.
En otros casos, el preprocesador evalúa una constante no definida como cero. Esto puede provocar resultados no deseados, como se muestra en el ejemplo siguiente. YES
no está definido, por lo que se evalúa como cero. La expresión #if
CONSTANT_NAME
se evalúa como false y el preprocesador quita el código que debía usarse en YES
. NO
también está sin definir (cero), por lo que #elif
CONSTANT_NAME==NO
se evalúa como true (0 == 0
), lo que hace que el preprocesador deje el código en la parte #elif
de la instrucción (justo lo contrario al comportamiento 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
Para ver exactamente cómo el compilador controla las directivas de preprocesador, use /P, /E o /EP.