Compartilhar via


Erro fatal C1017

expressão de constante de inteiro inválida

A expressão em uma diretiva #if não existia ou não era avaliada como uma constante.

As constantes definidas usando #define precisam ter valores que são avaliados como uma constante de inteiro se forem usadas em uma diretiva #if, #elif ou #else.

O seguinte exemplo gera o erro C1017:

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

Resolução possível:

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

Como CONSTANT_NAME é avaliada como uma cadeia de caracteres e não um inteiro, a diretiva #if gera um erro fatal C1017.

Em outros casos, o pré-processador avalia uma constante indefinida como zero. Isso pode causar resultados não intencionais, conforme mostrado no exemplo a seguir. YES é indefinida, portanto, ela é avaliada como zero. A expressão #if CONSTANT_NAME é avaliada como false e o código a ser usado em YES é removido pelo pré-processador. NO também é indefinido (zero), portanto #elif CONSTANT_NAME==NO é avaliado como true (0 == 0), fazendo com que o pré-processador saia do código na porção #elif da instrução — exatamente o oposto do comportamento pretendido.

// 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 exatamente como o compilador lida com diretivas de pré-processador, use /P, /E ou /EP.