Partager via


Erreur irrécupérable C1017

expression constante entière non valide

L’expression dans une directive #if n’existait pas ou n’était pas évaluée à une constante.

Les constantes, définies à l’aide de #define, doivent avoir des valeurs évaluées à une constante entière si elles sont utilisées dans une directive #if, #elif ou #else.

L’échantillon suivant génère l’erreur C1017 :

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

Résolution possible :

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

CONSTANT_NAME prenant la valeur d’une chaîne et non d’un entier, la directive #if génère une erreur irrécupérable C1017.

Dans d’autres cas, le préprocesseur évalue une constante non définie à zéro. Cela peut entraîner des résultats inattendus, comme illustré dans l’exemple suivant. YES n’est pas défini et prend donc la valeur zéro. L’expression #if CONSTANT_NAME prend la valeur false et le code à utiliser sur YES est supprimé par le préprocesseur. NO est également non défini (zéro). #elif CONSTANT_NAME==NO prend ainsi la valeur true (0 == 0), ce qui provoque l’abandon par le préprocesseur due code dans la partie #elif de l’instruction, exactement l’opposé du comportement prévu.

// 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

Pour afficher exactement la manière avec laquelle le compilateur gère les directives du préprocesseur, utilisez /P, /E ou /EP.