Да.Это совершенно законно.Отличие безымянного пространства имен в том, что содержимое пространства имен доступно только в объявленном им файле.Если он находится в файле .h
, он будет добавлен во все последующие файлы .cpp
, и каждый файл .cpp
будет иметь уникальную копию содержимого namespace
.
Фактически этолучший способ объявить глобальную переменную static
.Теперь посмотрим, какую разницу это будет иметь:
namespace {
struct X
{
void foo(int x);
};
int i; // declare this global variable
}
Если вы поместите этот код в файл заголовка, то, где бы этот файл заголовка не был #include
ed, все эти файлы .cpp
будут иметьдругая копия int i;
внутри них.Изменение значения i
в одном файле .cpp
не повлияет на другой файл .cpp
.
Более того, оно не даст ошибку компоновщика для нескольких определений, так как оно в безымянном namespace
.
Редактировать : Чтобы оценить его больше, определите пространство имен следующим образом:
// x.h
namespace
{
struct X
{
void foo(int x)
{
static int c; // static inside the function
cout<<"a = "<<(c++)<<endl;
}
};
}
Теперь #include
этот заголовочный файл в 2 разных .cpp
файлах.В обоих из них попробуйте вызвать foo()
с объектом X
.Будет напечатано:
a = 0
a = 0
Это означает, что X::foo()
в обоих .cpp
файлах отличаются .Если вы дадите имя namespace
и повторите то же самое, будет выведено
a = 0
a = 1
Таким образом, безымянный namespace
создает разные копии для каждой единицы перевода.