2011-11-21 2 views
59

네임 스페이스에 헤더 및 cpp 파일 내용을 모두 래핑하거나 헤더 내용 만 래핑 한 다음 cpp 파일의을 사용하여 을 수행하면 차이가 있습니까?헤더 및 소스 (cpp)에 C++ 네임 스페이스 만들기

차이점은 어떤 종류의 성능 저하 또는 문제를 일으킬 수있는 약간 다른 의미를 의미합니다.

예 :

// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
namespace X 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

VS

차이가 선호하는 형태와 그 이유는 무엇입니까없는 경우
// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
using namespace X; 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

?

답변

28

네임 스페이스는 충돌하지 않도록 기능 서명을 맹 글링하는 방법 일뿐입니다. 일부는 첫 번째 방법을 선호하고 다른 사람은 두 번째 버전을 선호합니다. 두 버전 모두 컴파일 타임 성능에는 영향을주지 않습니다. 네임 스페이스는 컴파일 타임 엔티티 일뿐입니다.

네임 스페이스 사용시 발생하는 유일한 문제는 같은 중첩 네임 스페이스 이름 (예 : X::X::Foo)이있는 경우입니다. 키워드를 사용하거나 사용하지 않고 혼란스러워집니다.

34

"네임 스페이스 X"와 "네임 스페이스 X 사용"의 차이점은 처음에는 새 선언이 네임 스페이스 아래에있는 반면 두 번째 선언에서는 그렇지 않습니다.

예를 들어 새로운 선언이 없으므로 아무런 차이가 없으므로 선호하는 방법이 없습니다.

+0

프로젝트와 스타일에 따라 다릅니다. 종종 모듈에 파일로드를위한 하나의 기본 네임 스페이스가 있으며 두 번째 스타일이 적합합니다. –

1

두 번째 컴파일 또한 차이가 없어야합니다. 네임 스페이스는 컴파일 타임에 처리되며 런타임 작업에 영향을 주어서는 안됩니다.

하지만 디자인 문제로 인해 두 번째 것은 끔찍합니다. 컴파일 (확실하지 않음)하더라도, 전혀 이해가되지 않습니다.

+1

차이는 있지만, 차이가 있기 때문에 아닙니다. 그러나 빗나간'{';-) –

+0

차이점은 Foo :: TheFunc()가 네임 스페이스에 정의되어있는 동안 전역 네임 스페이스에 선언 된 것입니다 X. –

1

Foo :: TheFunc()가 VS-case의 올바른 네임 스페이스에 없습니다. 'void X :: Foo :: TheFunc() {}'을 사용하여 올바른 네임 스페이스 (X)에 함수를 구현하십시오.

+0

질문이 조금 오래되었지만이 결과가 어떤 것인지 알고 있습니까? 즉VS 케이스가 네임 스페이스에서 함수를 선언하는 방식으로 문제가 발생하지만 외부에서 정의 할 수 있습니까? –

5

결과가 같을 수 있기 때문에 성능상의 제약이 없지만 Foo이 다른 네임 스페이스에있는 경우에 대비하여 내비게이션 Foo을 네임 스페이스에 넣으면 내재적으로 모호함이 발생합니다. 실제로 코드를 fubar로 얻을 수 있습니다. 이 목적으로 using을 사용하지 않는 것이 좋습니다.

그리고 당신은 길 잃은 { 경우 using namespace ;-)

+0

맨 마지막에 닫는'}'과 일치하므로 나는 그것을 길잃이라고 부르지 않을 것입니다. 그러나, 나는 그 중괄호 쌍을 중복이라고 부르겠다.) – blubberdiblub

+0

@blubberdiblub, 질문이 편집되었다. 만약 당신이 원래 버전을 체크했다면, 그것은 길잃이라고 부를 것이다 ;-) –

0

후 CPP 파일에서이 네임 스페이스를 사용하여 작성해야에만 .H 내용을 ... 랩 않는 경우가 그렇지 않은 경우 유효한 작업을 할 때마다 네임 스페이스. 일반적으로 두 .cpp와 .h 파일을 모두 감싸지 않으면 다른 네임 스페이스의 개체를 사용하여 많은 문제가 발생할 위험이 있습니다.