Глава 24. Пространства имен
Outer::AFunc() ;
687
В программе имеются две функции, которые находятся внутри двух отдельных пространств имен, и обе называются AFuncO. Для того чтобы отличать эти версии друг от друга, используется вложение пространств.
В данном случае анонимное пространство находится на том же уровне видимости, что и пространство inner. Следовательно, все ссылки без уточняющего префикса на элементы, имеющиеся в анонимном пространстве, но отсутствующие в пространстве outer, относятся к версиям из анонимного пространства. Именно так происходит в outer: :AFunc ().
void AFunc() (
cout « "Outer::AFunc\n";
cout « i « "\n";
cout « Inner::! « "\n";
«
// Ошибка — Outer::i не существует
// cout « Outer::! « "\n";
}
Заметим, что ссылка на i без уточнения относится к версии, которая принадлежит анонимному пространству, а использование уточнения inner:: i корректно ссылается на версию i из пространства inner. В то же время попытка доступа к i, принадлежащему анонимному пространству, в виде Outer: :i будет неудачной, поскольку outer не имеет собственной версии i. В этом случае компилятор выдаст сообщение: undefuned symbol Outer ::i (Неопределенный символ Outer: :i).
Анонимные пространства имен имеют достаточно ограниченное применение. Поскольку не вложенные анонимные пространства обеспечивают глобальную видимость, их можно использовать для хранения глобальных переменных без необходимости употреблять ключевое слово static. Если не считать такой возможности, можно сказать, что они доставляют больше хлопот, чем пользы.
Псевдонимы
Не исключено, что пространства имен вас разочаровали. Хотя их использование и помогает структурировать и упорядочить большие программы, набивка длинных уточняющих префиксов может оказаться очень утомительной. Ситуация оказывается еще хуже, если производитель придерживается правила давать пространствам длинные описательные имена. Действительно, нужен ЛИ Идентификатор AmalgamatedWoodchuckFeedCorp: :Bark вместо
простого и привычного Bark?