Поделиться через


Безымянные пространства имен

В качестве превосходной альтернативы глобальным статическим переменным можно объявить неименованное пространство имен.

namespace { declaration-list }

Заметки

Определение неименованного пространства имен, которое задано приведенным выше синтаксисом, действует так, как если бы вместо него находились следующие строки:

namespace unique { список-объявлений }

using namespace unique;

У каждого неименованного пространства имен имеется идентификатор, который присваивается и поддерживается программой. В нашем случае используется идентификатор unique, который отличается от всех других идентификаторов во всей программе. Например:

// unnamed_namespaces.cpp
// C2872 expected
namespace { int i; }          // unique::i
void f() { i++; }             // unique::i++

namespace A {
    namespace {
        int i;      // A::unique::i
        int j;      // A::unique::j
    }
}

using namespace A;

void h()
{
    i++;            // C2872: unique::i or A::unique::i
    A::i++;         // A::unique::i++
    j++;            // A::unique::j++
}

Неименованные пространства имен — это превосходная замена статическому объявлению переменных. Благодаря им переменные и функции будут видимыми в пределах всего блока трансляции, но невидимыми извне. Хотя сущности в неименованном пространстве имен и могут иметь внешние компоновки, фактически они определяются именем, которое является уникальным для их блока трансляции. Поэтому из любого другого блока трансляции они не видны.

См. также

Ссылки

Пространства имен (C++)