Share via


Upozornění kompilátoru (úroveň 4) C4471

'enumeration': Forward deklarace unscoped výčtu musí mít základní typ (int assumed)

Byla nalezena předávaná deklarace neskopovaného výčtu bez specifikátoru základního typu. Visual C++ ve výchozím nastavení předpokládá int , že je podkladovým typem výčtu. To může způsobit problémy, pokud se v definici výčtu používá jiný typ, například pokud je zadán jiný explicitní typ nebo pokud je inicializátor implicitně nastaven jiný typ. Můžete mít také problémy s přenositelností; jiné kompilátory nepředpokládá int , že je základním typem výčtu.

Toto upozornění je ve výchozím nastavení vypnuté; K povolení na příkazovém řádku můžete použít /Wall nebo /wN4471 nebo použít #pragma upozornění ve zdrojovém souboru.

Příklady

V některýchpřípadechch Pokud se za definicí zobrazí předaná deklarace pro výčet, může se toto upozornění aktivovat. Tento kód je například platný, i když může způsobit C4471:

// C4471a.cpp
// Compile with: cl /c /w14471 C4471a.cpp
enum Example { item = 0x80000000UL };
enum Example;    // Spurious C4471
// ...

Obecně platí, že je bezpečné použít úplnou definici pro neskopovaný výčet místo forward deklarace. Definici můžete vložit do souboru záhlaví a zahrnout ji do zdrojových souborů, které na ni odkazují. To funguje v kódu napsaného pro C++98 a novější. Toto řešení doporučujeme pro přenositelnost a snadnou údržbu.

// C4471b.cpp
// Compile with: cl /c /w14471 C4471b.cpp
enum Example;    // C4471
// To fix, replace the line above with the enumeration definition:
// enum Example { item = 0x80000000UL };
// ...

V jazyce C++11 můžete přidat explicitní typ do neskopovaného výčtu a do jeho předávané deklarace. Toto řešení doporučujeme pouze v případě, že logika zahrnutí komplexní hlavičky zabraňuje použití definice namísto předávané deklarace. Toto řešení může vést k problému s údržbou: pokud změníte základní typ použitý pro definici výčtu, musíte také změnit všechny předávací deklarace tak, aby odpovídaly, nebo v kódu může dojít k tichým chybám. Předanou deklaraci můžete vložit do souboru hlaviček, abyste tento problém minimalizovali.

Zdrojový soubor C4471c.cpp:

// C4471c.cpp
// Client code for enumeration defined in C4471d.cpp
// Compile with: cl /c /w14471 C4471c.cpp C4471d.cpp
enum Example;    // C4471, int assumed
// To fix, replace the lines above with the forward declarations:
// enum Example : unsigned;
// ...

Zdrojový soubor C4471d.cpp:

// C4471d.cpp
// Definition for enumeration used in C4471c.cpp
// Compile with: cl /c /w14471 C4471c.cpp C4471d.cpp
enum Example : unsigned { item = 0x80000000 }; // explicit type
// ...

Pokud pro výčet zadáte explicitní typ, doporučujeme také povolit upozornění C4369, které je ve výchozím nastavení zapnuté. To identifikuje případy, kdy položka výčtu vyžaduje jiný typ než explicitně zadaný typ.

Kód můžete změnit tak, aby používal výčt s vymezeným oborem, funkci, která je v jazyce C++11 nová. Definice i veškerý klientský kód, který používá typ výčtu, musí být změněny tak, aby používaly výčtu s vymezeným oborem. Pokud máte problémy se znečištěním oboru názvů, doporučujeme použít výčtový výčet, protože názvy definovaných položek výčtu jsou omezeny na rozsah výčtu. Další funkcí výčtu s vymezeným oborem je, že jeho členy nelze implicitně převést na jiný integrální typ nebo výčtu, což může být zdrojem drobných chyb.

Zdrojový soubor C4471e.cpp:

// C4471e.cpp
// Client code for scoped enumeration defined in C4471f.cpp
// Compile with: cl /c /w14471 C4471e.cpp C4471f.cpp
enum Example;    // C4471
// To fix, replace the line above with the forward declaration:
// enum class Example;
// ...

Zdrojový soubor C4471f.cpp:

// C4471f.cpp
// Definition for scoped enumeration used in C4471e.cpp
// Compile with: cl /c /w14471 C4471e.cpp C4471f.cpp
enum class Example { item = 0 };
// ...