Безымянные пространства имен
В качестве превосходной альтернативы глобальным статическим переменным можно объявить неименованное пространство имен.
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++
}
Неименованные пространства имен — это превосходная замена статическому объявлению переменных. Благодаря им переменные и функции будут видимыми в пределах всего блока трансляции, но невидимыми извне. Хотя сущности в неименованном пространстве имен и могут иметь внешние компоновки, фактически они определяются именем, которое является уникальным для их блока трансляции. Поэтому из любого другого блока трансляции они не видны.