Udostępnij za pośrednictwem


Błąd krytyczny C1017

nieprawidłowe wyrażenie stałej liczby całkowitej

Uwagi

Wyrażenie w #if dyrektywie nie istnieje lub nie zostało obliczone na stałą.

Stałe zdefiniowane przy użyciu #define muszą mieć wartości, które są obliczane na stałą całkowitą, jeśli są używane w #ifdyrektywie , #eliflub #else .

Przykład

Poniższy przykład generuje kod C1017:

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

Możliwe rozwiązanie:

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

Ponieważ CONSTANT_NAME funkcja oblicza ciąg, a nie liczbę całkowitą, #if dyrektywa generuje błąd krytyczny C1017.

W innych przypadkach preprocesor ocenia niezdefiniowaną stałą jako zero. Może to spowodować niezamierzone wyniki, jak pokazano w poniższym przykładzie. YES jest niezdefiniowany, więc oblicza wartość zero. Wyrażenie #ifCONSTANT_NAME daje wartość false, a kod, który ma być używany YES , jest usuwany przez preprocesor. NO jest również niezdefiniowany (zero), więc #elifCONSTANT_NAME==NO daje w wyniku wartość true (0 == 0), powodując, że preprocesor pozostawi kod w #elif części instrukcji — dokładnie odwrotnie od zamierzonego zachowania.

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

Aby dokładnie sprawdzić, jak kompilator obsługuje dyrektywy preprocesora, użyj /P, /E lub /EP.