Точка объявления
Имя считается объявленным сразу после его декларатора, но перед его (необязательным) инициализатором. (Дополнительные сведения о деклараторах см. в разделе Деклараторы.) Перечислитель считается объявленным сразу после идентификатора, который его именует, но перед его (необязательным) инициализатором.
Рассмотрим следующий пример.
// point_of_declaration1.cpp
// compile with: /W1
double dVar = 7.0;
int main()
{
double dVar = dVar; // C4700
}
Если бы точка объявления располагалась после инициализации, то локальная переменная dVar инициализировалась бы значением 7,0 — значением глобальной переменной dVar. Поскольку это не так, dVar инициализируется неопределенным значением.
Для перечислителей действует то же правило. Однако перечислители экспортируются во внешнюю область видимости перечисления. В следующем примере объявляются перечислители Spades, Clubs, Hearts и Diamonds. Поскольку перечислители экспортируются во внешнюю область видимости, считается, что они имеют глобальную область видимости. Идентификаторы в примере уже определены в глобальной области видимости.
Рассмотрим следующий код.
const int Spades = 1, Clubs = 2, Hearts = 3, Diamonds = 4;
enum Suits
{
Spades = Spades, // error
Clubs, // error
Hearts, // error
Diamonds // error
};
Поскольку идентификаторы в предыдущем коде уже определены в глобальной области видимости, выдается сообщение об ошибке.
Примечание
Использование одного и того же имени для ссылки на несколько элементов программы, например перечислитель и объект, считается плохим стилем программирования, который следует избегать.В предыдущем примере такое поведение приводит к ошибке.