2010-07-09 6 views
2

아래의 스 니펫과 같은 네임 스페이스를 사용할 수 있습니까? 이 코드는 gcc와 msvc 모두에서 컴파일되므로 네임 스페이스 사용법에 대해 혼란 스럽습니다. f1.h에서C++에서 네임 스페이스 사용

:
I 함수가 정의되어야한다고 생각 `

 
void My::foo() 
{ 
} 

f1.cpp에서

 
namespace My 
{ 
void foo(); 
} 

로서 :

 
namespace My { 
void foo() {} 
} 

아무도 친절하게 explai 수 있습니다. 엔?

감사합니다.

답변

8

네임 스페이스 외부에 네임 스페이스 멤버를 정의하면 네임 스페이스의 이름 앞에 네임 스페이스의 이름이 접두어로 사용되며 정의는 실제로 네임 스페이스를 묶는 네임 스페이스에서 발생합니다. 멤버 네임 스페이스 내부에 중첩 된 네임 스페이스에서는 발생할 수 없습니다.

namespace A { void f(); } 
void A::f() { } // prefix with "A::" 

namespace B { } 
void B::f() { } // invalid! not declared in B! 

namespace C { void f(); } 
namespace D { void C::f() { } } // invalid! D doesn't enclose C 

namespace E { 
    void f(); 
    namespace F { 
    void E::f() { } // invalid! F is nested inside E! 
    } 
} 

그것은 당신이 또한 당신이 클래스의 이름으로 이름을 접두사로, 자신의 클래스의 외부에서 함수를 정의 할 수 있습니다 클래스 멤버와 동일한 물건입니다. 그러나 클래스의 경우 네임 스페이스 멤버는 외부 네임 스페이스를 정의하기 전에 해당 네임 스페이스에서 먼저 선언해야합니다.

+0

어느 쪽이 더 관용적입니까? – Philipp

+0

@Philipp 필자는 인라인 함수를 직접 배치하고 다른 함수를 따로 정의합니다. 특히 헤더/구현 파일 분리가있는 경우. –

+0

동어 반복이 아닌가요? 클래스 정의에 정의 된 함수는 항상 인라인입니다. 내가 의미하는 바는'A :: f' 또는'네임 스페이스 A {f} '를 사용하여 독립 함수를 정의할지 여부입니다. 적어도 Boost는 후자를 선호하는 것 같습니다. – Philipp

0

그래, 괜찮아. "My ::"를 수행하면 "My"네임 스페이스를 사용하고 있음을 나타냅니다. 당신이로 "표준 : : 벡터 < INT>를"... STL과 벡터를 선언 할 수

같은 방법은

0

모두 사실이다

당신은 세계적으로 각 기능

에 대한 네임 스페이스를 설정할 수 있습니다
namespace My { 
//in this are functions are in "My" namespace 
} 

namespace Your { 
//in this are functions are in "Your" namespace 
} 

My::foo() {} 
My::bar() {} 
Your::foo() {} 

당신은 "내 :"각 함수의 시작 부분에 요 쓰고 싶지 않는 경우 첫 번째로 씁니다. 두 번째는 두 개 이상의 네임 스페이스가있는 경우에 유용합니다.

0

다음과 같은 기능을합니다. using std namespace; 상단에 그냥 std :: cout 대신 cout을 수행하십시오. 둘 다 작동하며 둘 다 유효하지만 사용 방법에 대해 생각해야합니다. 프로와 단점이 있습니다.

0

나는이 허용되는 것을 좋아한다 :

namespace My 
{ 
void foo(); 
} 

그것은 유틸리티 방법이 매우 긴 경우는 헤더 파일을 어수선하게하지 않는다는 것을 의미한다. 그렇게하면 네임 스페이스에 어떤 메소드가 제공되는지 더욱 분명하게 알 수 있습니다.

나는 이것이 현대 IDE의 표현력과 함께 null 포인트 일 수 있지만 여전히 깨끗한 헤더 파일을 갖는 데 도움이된다는 것을 알고있다.

관련 문제