Глава 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, определенная вне пространства имен. Остается