Подтвердить что ты не робот

Вложенное анонимное пространство имен?

При использовании анонимного пространства имен есть ли какие-либо проблемы, если он вложен в другое пространство имен? Например, существует ли какая-либо реальная разница между 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();
    }
}
4b9b3361

Ответ 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, поэтому разница не будет возникать.