Вложенное анонимное пространство имен?
При использовании анонимного пространства имен есть ли какие-либо проблемы, если он вложен в другое пространство имен? Например, существует ли какая-либо реальная разница между Foo1.cpp и Foo2.cpp в следующем коде:
// Foo.h
namespace Foo
{
void fooFunc();
}
// Foo1.cpp
namespace Foo
{
namespace
{
void privateFunction()
{
...
}
}
void fooFunc()
{
privateFunction();
}
}
// Foo2.cpp
namespace
{
void privateFunction()
{
...
}
}
namespace Foo
{
void fooFunc()
{
privateFunction();
}
}
Ответы
Ответ 1
Анонимное пространство имен можно рассматривать как обычное пространство имен с уникальным именем, которое вы не знаете. Согласно стандарту С++ 7.3.1.1:
Определение без имени-namespace ведет себя так, как если бы оно было заменено на
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
где все вхождения уникальной единицы перевода заменены одним и тем же идентификатором, и этот идентификатор отличается от всех других идентификаторов во всей программе.
Нет дополнительных проблем.
Ответ 2
Наверное, нет никакой реальной разницы для ваших целей. Это имеет значение, когда в вашем файле cpp privateFunction
видна. Если вы добавите void barFunc() { privateFunction(); }
в конец обоих файлов, то компиляции Foo2.cpp и Foo1.cpp не будут.
Обычно вы не определяете внешние символы из множества разных пространств имен в одном и том же файле cpp, поэтому разница не будет возникать.