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.