Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
"Enumerálás": egy hatókör nélküli enumerálás előleges deklarációjának alapul szolgáló típussal kell rendelkeznie (feltételezve, hogy int)"
Megjegyzések
A rendszer nem definiált számbavétel előre deklarációját észlelte az alapul szolgáló típus megadása nélkül. Alapértelmezés szerint a Visual C++ feltételezi int , hogy az enumerálás alapjául szolgáló típus. Ez problémákat okozhat, ha az enumerálási definícióban más típust használnak, például ha egy másik explicit típus van megadva, vagy ha egy inicializáló implicit módon beállít egy másik típust. Hordozhatósági problémákat is tapasztalhat; más fordítók nem feltételezik int az enumerálás alapjául szolgáló típust.
Ez a figyelmeztetés alapértelmezés szerint ki van kapcsolva; A /Wall vagy a /wN4471 használatával engedélyezheti a parancssorban, vagy használhatja #pragma figyelmeztetést a forrásfájlban.
Példák
Bizonyos esetekben ez a figyelmeztetés hamis. Ha a definíció után megjelenik egy enumerálásra vonatkozó továbbítási deklaráció, a figyelmeztetés aktiválható. Ez a kód például érvényes, annak ellenére, hogy c4471-et okozhat:
// C4471a.cpp
// Compile with: cl /c /w14471 C4471a.cpp
enum Example { item = 0x80000000UL };
enum Example; // Spurious C4471
// ...
Általánosságban elmondható, hogy biztonságos a teljes definíció használata a nem definiált enumeráláshoz a továbbítási deklaráció helyett. A definíciót elhelyezheti egy fejlécfájlban, és belefoglalhatja az arra hivatkozó forrásfájlokba. Ez a C++98-ra és újabb verziókra írt kódban működik. Ezt a megoldást a hordozhatóság és a könnyű karbantartás érdekében javasoljuk.
// 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 };
// ...
A C++11-ben explicit típust adhat hozzá egy nem célzott számbavételhez és a továbbítási deklarációhoz. Ezt a megoldást csak akkor javasoljuk, ha az összetett fejlécbefoglalási logika megakadályozza a definíció használatát a továbbítási deklaráció helyett. Ez a megoldás karbantartási problémát okozhat: ha módosítja a felsorolás definíciójához használt mögöttes típust, akkor az összes előre deklarációt is módosítania kell, hogy megfeleljenek, különben csendes hibák fordulhatnak elő a kódban. A probléma minimalizálása érdekében a továbbítási deklarációt egy fejlécfájlba helyezheti.
Forrásfájl 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;
// ...
Forrásfájl 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
// ...
Ha explicit típust ad meg egy enumeráláshoz, javasoljuk, hogy engedélyezze a C4369 figyelmeztetést is, amely alapértelmezés szerint be van kapcsolva. Ez azonosítja azokat az eseteket, amikor az enumerálási elemhez a explicit módon megadott típustól eltérő típus szükséges.
A kódot úgy módosíthatja, hogy a C++11-ben új, hatókörrel rendelkező enumerálást használjon. A definíciót és az enumerálási típust használó ügyfélkódot is módosítani kell a hatókörrel rendelkező enumerálás használatához. Ha a névtérszennyezéssel kapcsolatos problémákat tapasztal, érdemes hatókörrel rendelkező enumot használnia, mivel a definiált enum elemeinek a neve csak az enum hatókörére korlátozódik. A hatókörrel rendelkező enumerálás másik funkciója, hogy tagjai nem konvertálhatók implicit módon egy másik integrál- vagy számbavételi típussá, ami finom hibák forrása lehet.
Forrásfájl 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;
// ...
Forrásfájl 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 };
// ...