Поделиться через


Неустранимая ошибка 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 не определен, поэтому он оценивается до нуля. Выражение #ifCONSTANT_NAME оценивается как false, а используемый код YES удаляется препроцессором. NO также не определен (ноль), поэтому #elifCONSTANT_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.