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.