Глава 24. Пространства имен__________________________________685
попытаться использовать в main() переменную i без уточнения, возникнет ошибка.
void main() {
i++;
cout « i « endl;
z++;
cout « z « endl;
При попытке компиляции такой версии программы компилятор выдаст
сообщение об ошибке: Ambiguity between 'i' and ' <unnamedNS>: : i'
(Неоднозначность имен 'i' и ' <unnamedNS>: :i'). На первый взгляд, мало смысла в возможности определять переменные, если реальная попытка обращения к переменным приводит к ошибкам.. Это действительно так, но i может быть использована в предыдущем примере, если только будет уточнена префиксом. *
Здесь возникает естественный вопрос: как же уточнять переменную i с помощью префикса — имени пространства, если у пространства нет имени? В действительности глобальный уровень всегда имеет имя. В соответствии с установкой C++ к определениям глобального уровня всегда можно получить доступ с помощью операции разрешения области видимости ::. Таким образом, выражение :: i будет ссылаться на глобальную версию i, а не на ту, что существует внутри анонимного пространства. Рассмотрим новый вариант программы из листинга 24.12.
ftinclude <iostream.h>
namespace {
int i = 10;
int z = 5;
i
int i = 1;
void main() {
: :i++;
cout « ::i « endl;
z++;
cout « z « endl;
На выходе эта программа выдает числа 2 и 6. Ясно, что при этом используется глобальная версия i, определенная вне пространства имен. Остается