Sdílet prostřednictvím


Závažná chyba C1017

Neplatný celočíselná konstanta výrazu

Poznámky

Výraz v direktivě #if neexistuje nebo se nevyhodnotil jako konstanta.

Konstanty definované pomocí #define musí mít hodnoty, které se vyhodnotí jako celočíselná konstanta, pokud jsou použity v #if#elif, nebo #else direktivě.

Příklad

Následující příklad vygeneruje C1017:

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

Možné řešení:

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

Vzhledem k tomu CONSTANT_NAME , že se vyhodnotí jako řetězec a ne celé číslo, generuje #if direktiva závažnou chybu C1017.

V jiných případech preprocesor vyhodnotí nedefinovanou konstantu jako nulu. To může způsobit nezamýšlené výsledky, jak je znázorněno v následujícím příkladu. YES je nedefinovaný, takže se vyhodnotí jako nula. Výraz #ifCONSTANT_NAME se vyhodnotí jako false a preprocesor odebere kód, na který se má použít YES . NO je také nedefinovaný (nula), takže #elifCONSTANT_NAME==NO se vyhodnotí jako true (0 == 0), což způsobí, že preprocesor nechá kód v #elif části příkazu – přesně naopak zamýšleného chování.

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

Chcete-li přesně zjistit, jak kompilátor zpracovává direktivy preprocesoru, použijte /P, /E nebo /EP.