Вложенное анонимное пространство имен? - PullRequest
31 голосов
/ 19 января 2010

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

Ответы [ 2 ]

30 голосов
/ 19 января 2010

Анонимное пространство имен можно рассматривать как обычное пространство имен с уникальным именем, которое вы не знаете. Согласно стандарту C ++ 7.3.1.1:

Определение безымянного пространства имен ведет себя так, как если бы оно было заменено на

  namespace unique { /* empty body */ }
  using namespace unique;
  namespace unique { namespace-body }

, где все вхождения уникальные в единице перевода заменены одним и тем же идентификатором, и этот идентификатор отличается от всех других идентификаторов во всей программе.

Нет дополнительных проблем.

3 голосов
/ 19 января 2010

Вероятно, нет никакой реальной разницы для ваших целей.Имеет значение, где в вашем файле cpp privateFunction видно.Если вы добавите void barFunc() { privateFunction(); } в конец обоих файлов, то Foo2.cpp компилируется, а Foo1.cpp - нет.

Обычно вы не определяете внешние символы из множества различных пространств имен в одном и том же файле cpp.так что разница не возникнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...