2011-03-26 5 views
3

안녕 모두, 내가 가진 같은 코드 : 나는 a.cpp 파일의 아를 수입하는 경우매크로 가드 헤더에서 작동하지 않습니다

//a.h 
#ifndef SB 
#define SB 
namespace A{ int a = 10; int b = 10;} 
#endif 

그러나, 컴파일러는 불평 것 :

error LNK2005: "int A::a" ([email protected]@@3HA) already defined in a.obj 

컴파일러가 명시 적 "import"문없이 .h 파일과 .cpp 파일을 함께 결합하는 것처럼 보입니다. 그러나 그것이 정의 된 매크로 가드와 함께 일어날 것이라는 것은 나에게 의미가 없다.

나는

답변

3

기회는 당신이 그 개체가 파일을 함께 중복 항목을 얻을 연결하려고 다음 두 오브젝트 파일에 헤더 파일을 넣고 일부 순환의 #include 문이 있습니다 Visual C++를 사용합니다.

컴파일러가 수행하는 작업이 include 될 때 .h 파일의 내용을 잘라내거나 붙여 넣는 것임을 기억하십시오.

.h 파일에서 프로토 타입을 선언하고 해당 개체 및 해당 값의 실제 선언이 아닌 다른 프로토 타입을 선언 할 수 있습니다.

11

#include 가드는 하나의 파일이 동일한 .h 파일을 여러 번 포함하는 것을 방지합니다. 그들은 하나의 .h 파일을 포함하여 여러 파일을 한 번만 방지합니다. 이는 내가 여러분에게 일어나고 있다고 가정합니다. 하나의 .cpp 파일로 정의를 이동하고 여기에 단지 선언 떠나 : 이러한 변수 어딘가에 존재하는 컴파일러를 알려줍니다

namespace A { 
    extern int a; 
    extern int b; 
} 

을하지만, 그 정의는 다른 곳에서 찾을 수 있습니다.

//a.h 
#ifndef SB 
#define SB 
    namespace A{const int a = 10; const int b = 10;} 
#endif 

을하며 여러 장소에 포함하는 문제가되지 않습니다 : 당신은 a와 b는 상수 값을 가지고 싶다면

+0

해결 방법은 좋지만 문제는 @James가 더 잘 식별 할 수 있다고 생각합니다. –

+0

+1 해결책이있을뿐만 아니라 문제의 원인도 아주 잘 설명되어 있습니다. –

0

, 당신은이 작업을 수행 할 수 있습니다.

값을 변경해야하는 경우 dfan의 조언을 따라야합니다.