Неустранимая ошибка C1017
недопустимое константное выражение целого типа
Выражение в директиве #if
не существовало или не вычислялось константой.
Константы, определенные с помощью, #define
должны иметь значения, которые оценивают целочисленную константу, если они используются в #if
#elif
директиве , или #else
директиве.
Следующий пример приводит к возникновению ошибки C1017:
// C1017.cpp
#define CONSTANT_NAME "YES"
#if CONSTANT_NAME // C1017
#endif
Возможное решение
// C1017b.cpp
// compile with: /c
#define CONSTANT_NAME 1
#if CONSTANT_NAME
#endif
Так как CONSTANT_NAME
вычисляется строка, а не целое число, #if
директива создает неустранимая ошибка C1017.
В других случаях препроцессор вычисляет неопределенную константу как нулю. Это может привести к непредвиденным результатам, как показано в следующем примере. YES
не определен, поэтому он оценивается до нуля. Выражение #if
CONSTANT_NAME
оценивается как false, а используемый код YES
удаляется препроцессором. NO
также не определен (ноль), поэтому #elif
CONSTANT_NAME==NO
вычисляется значение true (0 == 0
), что приводит к тому, что препроцессор покидает код в #elif
части инструкции , точно противоположное предполагаемому поведению.
// 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
Чтобы узнать, как компилятор обрабатывает директивы препроцессора, используйте /P, /E или /EP.