Compartir a través de


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 #ifCONSTANT_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 #elifCONSTANT_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.