2010-01-19 6 views
26

익명 네임 스페이스를 사용할 때 다른 네임 스페이스 내에 중첩되면 문제가 있습니까?중첩 된 익명 네임 스페이스?

// 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

익명 네임 스페이스가 당신이 모르는 고유 한 이름으로 일반 네임 스페이스로 간주 될 수 예를 들어, 다음 코드에서 Foo1.cpp와 Foo2.cpp 사이의 실제 차이가있다. 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 파일에서 많은 다른 네임 스페이스의 외부 기호를 정의하지 않으므로 차이가 발생하지 않습니다.

관련 문제