Partilhar via


Erro fatal C1017

expressão constante inteira inválida

Observações

A expressão numa #if diretiva não existia ou não era uma constante.

As constantes definidas usando #define devem ter valores que correspondem a uma constante inteira se forem usadas numa #if, #elif ou #else diretiva.

Exemplo

O exemplo a seguir gera 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

A diretiva #if gera o erro fatal C1017 porque CONSTANT_NAME avalia como uma cadeia de caracteres e não como um inteiro.

Em outros casos, o pré-processador avalia uma constante indefinida como zero. Isso pode causar resultados não intencionais, como mostrado no exemplo a seguir. YES é indefinido, por isso avalia a zero. A expressão #ifCONSTANT_NAME é avaliada como false e o código a ser usado em YES é removido pelo pré-processador. NO também é indefinido (zero), portanto #elifCONSTANT_NAME==NO avalia como true (0 == 0), fazendo com que o pré-processador deixe o código na #elif parte 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.