Point de déclaration
Un nom est considéré comme déclaré immédiatement après son déclarateur mais avant son initialiseur (facultatif). (Pour plus d'informations sur les déclarateurs, consultez Déclarateurs.) Un énumérateur est considéré comme déclaré immédiatement après l'identificateur qui lui attribue son nom, mais avant son initialiseur (facultatif).
Considérez cet exemple :
// point_of_declaration1.cpp
// compile with: /W1
double dVar = 7.0;
int main()
{
double dVar = dVar; // C4700
}
Si le point de déclaration avait lieu après l'initialisation, alors la variable locale dVar serait initialisée à 7,0, la valeur de la variable globale dVar. Toutefois, comme ce n'est pas le cas, dVar est initialisé avec une valeur non définie.
Les énumérateurs suivent la même règle. Toutefois, ils sont exportés vers la portée englobante de l'énumération. Dans l'exemple suivant, les énumérateurs Spades, Clubs, Heartset Diamonds, sont déclarés. Les énumérateurs étant exportés vers la portée englobante, ils sont considérés comme ayant la portée globale. Les identificateurs dans l'exemple sont déjà définis dans la portée globale.
Examinons le code ci-dessous.
const int Spades = 1, Clubs = 2, Hearts = 3, Diamonds = 4;
enum Suits
{
Spades = Spades, // error
Clubs, // error
Hearts, // error
Diamonds // error
};
Les identificateurs dans le code précédent étant déjà définis dans la portée globale, un message d'erreur est généré.
Notes
L'utilisation du même nom pour faire référence à plusieurs éléments de programme (par exemple, un énumérateur et un objet) est considérée comme une pratique de programmation médiocre et doit être évité.Dans l'exemple précédent, cette pratique provoque une erreur.