2010-08-09 6 views
0

난 내가 아래로 네임 스페이스를 사용하는 헤더 파일 MyNameSpace.h 있습니다중복 기호 문제

namespace NameSpace1 

{ 
string first = "First"; 
... 
} 

namespace NameSpace2 

{ 
string top = "Top"; 
} 

을하지만 헤더 파일을 포함하여 내 다른 클래스의 네임 스페이스 개체를 사용하는 경우. NameSpace1 :: first와 중복되는 심볼 오류가 발생했습니다. 정확히 무엇을 의미하고 어떻게이 솔루션을 해결할 수 있습니다.

답변

15

헤더에 전역을 정의하면 안되므로 extern 키워드로 컴파일러에게 정의해야합니다. 그렇지 않으면 컴파일러는 헤더를 포함하는 모든 소스 파일에서 변수를 정의하려고합니다.

예 : , 당신은 밖으로 개체를 만들 수 없습니다 모든

namespace NameSpace1 { 
    std::string first = "First"; 
} 
+0

외부가 외부를 의미합니까? – DumbCoder

+0

예, 죄송합니다. 결정된. –

+0

이 제안을 해주셔서 감사합니다 ... – boom

0

먼저 네임 스페이스의 객체가 될 수 없다 : MyNameSpace.h에 당신이 할 :

namespace NameSpace1 { 
    extern std::string first; 
} 

는 그런 다음 MyNameSpace.cpp에서이 작업을 수행 할 수 있습니다 네임 스페이스의. 이름 확인에만 있습니다. 다중 정의 문제와 관련하여 헤더 파일에 대해 include guard이 누락 된 것일 수 있습니다.

+0

포함 가드는 단일 컴파일 단위 (예 : 소스 파일)에 여러 포함을 보호하기 때문에 여러 변수 정의에 도움이되지 않습니다. –

+0

@reko_t : 포함 가드가없고 동일한 헤더 파일이 단일 번역 단위에 두 번 포함 된 경우 여러 재정의 오류가 발생합니다. 그렇지 않니? – Naveen

+0

그래, 그렇긴하지만 변수가 'extern'으로 선언되지 않은 경우에만 'extern'이있는 중복 된 심볼은 포함 가드가 없어도 오류를 생성하지 않습니다. –

0

@reko_t : 포함 가드는 단일 컴파일 단위 (예 : 소스 파일)에 여러 포함을 보호하기 때문에 포함 변수가 여러 변수 정의에 도움이되지 않습니다.

실제로 여러 정의를 방지하지 않습니까?

+1

중복 된 기호 정의는 여러 번역 단위에서 발생합니다. 예를 들어 foo.h (include guards 포함)에'int foo = 10;'이 있고 a.cpp와 b.cpp에서 foo.h가 포함되면 foo가 두 번 이상 정의되었다는 오류가 발생합니다 . 그 이유는 전 처리기 정의가 각 변환 단위에 대해 재설정되기 때문입니다. –