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

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

2 ответа

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

An Безмятенные-пространство имен-определение, как если бы он был заменен на

  пространство имен уникальным {/ * пустое тело * /}
  используя пространство имен уникальным;
  Пространство имен уникально {пространство имен-тело}
 

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

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

31
ответ дан 27 November 2019 в 21:09
поделиться

, вероятно, не реальная разница для ваших целей. Это имеет значение, где в вашем файле CPP видима . Если вы добавите void barfunc () {padifunction (); } К концу обоих файлов, то foo2.cpp компилирует и foo1.cpp не.

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

3
ответ дан 27 November 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: