Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
'opsomming': een forward-declaratie van een niet-gescoopte opsomming moet een onderliggend type hebben (int verondersteld)
Opmerkingen
Er is een vooruitverklaring van een niet-gescoopte enumeratie gevonden zonder een specificatie voor het onderliggende type. Visual C++ gaat standaard uit van int het onderliggende type voor een opsomming. Dit kan problemen veroorzaken als een ander type wordt gebruikt in de opsommingsdefinitie, bijvoorbeeld als een ander expliciet type is opgegeven of als een ander type impliciet wordt ingesteld door een initialisatiefunctie. Mogelijk hebt u ook problemen met de draagbaarheid; andere compilers gaan er niet van uit dat int het onderliggende type opsomming is.
Deze waarschuwing is standaard uitgeschakeld; u kunt /Wall of /wN4471 gebruiken om deze in te schakelen op de opdrachtregel, of gebruik #pragma waarschuwing in uw bronbestand.
Voorbeelden
In sommige gevallen is deze waarschuwing oneigenlijk. Als er na de definitie een doorstuurdeclaratie voor een opsomming wordt weergegeven, kan deze waarschuwing worden geactiveerd. Deze code is bijvoorbeeld geldig, ook al kan dit C4471 veroorzaken:
// C4471a.cpp
// Compile with: cl /c /w14471 C4471a.cpp
enum Example { item = 0x80000000UL };
enum Example; // Spurious C4471
// ...
Over het algemeen is het veilig om de volledige definitie te gebruiken voor een niet-gescoopte opsomming in plaats van een doorstuurdeclaratie. U kunt de definitie in een headerbestand plaatsen en opnemen in bronbestanden die ernaar verwijzen. Dit werkt in code die is geschreven voor C++98 en hoger. We raden deze oplossing aan voor draagbaarheid en onderhoudsgemak.
// 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 };
// ...
In C++11 kunt u een expliciet type toevoegen aan een niet-gescopeerde enumeratie en aan de voorwaartse declaratie ervan. We raden deze oplossing alleen aan als complexe logica voor het opnemen van headers het gebruik van de definitie voorkomt in plaats van een doorstuurdeclaratie. Deze oplossing kan leiden tot een onderhoudsprobleem: als u het onderliggende type wijzigt dat wordt gebruikt voor de opsommingsdefinitie, moet u ook alle doorstuurdeclaraties wijzigen zodat deze overeenkomen, of als u mogelijk stille fouten in uw code hebt. U kunt de declaratie in een koptekstbestand plaatsen om dit probleem te minimaliseren.
Bronbestand 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;
// ...
Bronbestand 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
// ...
Als u een expliciet type opgeeft voor een opsomming, wordt u aangeraden ook waarschuwing C4369 in te schakelen. Deze optie is standaard ingeschakeld. Dit identificeert gevallen waarin een opsommingsitem een ander type vereist dan het expliciet opgegeven type.
U kunt uw code wijzigen om een scoped enum te gebruiken, een functie die nieuw is in C++11. Zowel de definitie als elke clientcode die gebruikmaakt van het opsommingstype, moet worden gewijzigd om een scoped enum te gebruiken. U wordt aangeraden een scoped enum te gebruiken als u problemen ondervindt met de vervuiling van de naamruimte, omdat de namen van gedefinieerde opsommingsitems beperkt zijn tot het bereik van de opsomming. Een andere functie van een scoped enum is dat de leden niet impliciet kunnen worden geconverteerd naar een ander integraal of opsommingstype, wat een bron van subtiele bugs kan zijn.
Bronbestand 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;
// ...
Bronbestand 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 };
// ...