2010-01-19 3 views
26

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

Экспортированные символы будут отличаться. Взгляните на выход nm. –

+2

Просто, чтобы быть педантичным, технический термин - это «неназванное пространство имен», а не анонимное. – GManNickG

+0

Союзы анонимны, пространство имен не называется. Но кто заботится :) –

ответ

26

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

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

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

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

Дополнительные сведения отсутствуют.

3

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

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

Смежные вопросы