2012-03-12 4 views
2

외부 링크가있는 상수를 정의하려는 abc.h라는 헤더 파일이 있습니다. 따라서 문이 포함되어 있습니다.extern const in C++

--------------- abc.h ----------------------- -

extern const int ONE = 1; 

다음으로 main.cpp가 있습니다. 여기서 하나의 값을 사용하고 싶습니다. 따라서 나는 그것을 사용하기 전에 main.cpp에 하나를 선언한다.

--------------- main.cpp --------------- ------

extern const int ONE; 
int main() 
{ 
    cout << ONE << endl; 
} 

"ONE의 다중 정의"오류가 발생합니다.

내 질문은, 어떻게 const 외부 링크로 선언 할 수 있으며 상수의 정적 버전을 포함하는 각 파일에 반대 상수 하나의 메모리 위치가 있도록 다른 파일에서 이후에 그것을 사용할 수 있습니다.


main.cpp에서 #include "abc.h"가 삭제되었으며 모든 것이 작동합니다.

g ++ abc.h MAIN.CPP -o 메인

ONE의 주소 헤더와 메인 동일하다. 그래서 작동합니다.

는하지만 난 그것은 마법을 수행 ++ g처럼 보인다 MAIN.CPP

에 문을 포함 컴파일러가없이 하나의 정의를 해결하는 방법을 이해 해달라고. main.cpp의 독자가 main.cpp에 "abc.h"를 포함하지 않으므로 ONE이 선언 된 곳을 알지 못하는 나쁜 습관입니까? 내가 외부 링크와 CONST를 선언하고 다른 파일에 이후에 그것을 을 사용하는 방법을

+0

'무엇을 first'입니까? –

+0

내 잘못, 먼저 제거됨 – Jimm

+0

두 위치 모두에 'extern'이 있습니까? (위에서 작성한 코드가 나를 위해 잘 작성되었습니다.) 또한 [Extern과 const 혼합하기] (http://stackoverflow.com/questions/2190919/mixing-extern-and-const)를 확인하십시오. –

답변

-1

기본 정상 변수 또는 타입이 보유하고 외부 링크하여

, 당신이 가진 것을 제공 namespace 범위 및 static에 선언되어 있습니다. 어딘가에 정의 할

// abc.h 
const int ONE = 1; // not "extern" 

ONE 요구 :

은 단순히 변수를 정의합니다.
"extern"을 제거한 후 안에 main.cpp을 입력하면됩니다.
헤더 파일이 여러 개의 .cpp 파일에 포함되어 있어도 헤더 파일에 const int은 "const"때문에 여러 정의 연결 오류가 발생하지 않습니다.

+0

기본적으로 const에는 내부 링크가 있습니다. 파일 레벨이 – Jimm

+0

@ Jimm 인 경우에도 주석을 작성한 상태에서 편집 중이 었습니다. – iammilind

+2

이제 대답은 의미가 없습니다. 당신은 "그냥해라."라고 시작하지만 "실제로는 당신이 묻는 것을 전혀하지 않습니다." –

8

abc.h :

extern const int ONE; 

ABC.CPP :

#include "abc.h" 

const int ONE = 1; 

가 MAIN.CPP :

#include "abc.h" 

int main() { 
    cout << ONE << endl; 
} 
+0

흥미로운 점은 extern 선언은 변수가 정의 된 것과 동일한 번역 단위에서 작성되어야한다는 점입니다. 이 예제에서는 효과적으로 extern const를 선언 한 다음 동일한 파일에 정의합니다. 이것은 const가 아닌 변수에는 필요하지 않으며 단지 정의하고 외부 연결을가집니다. – tstittleburg

+0

또는'abc.cpp'는'extern const int ONE = 1;'한 줄만 포함 할 수 있습니다. 자세한 내용은 C++ Primer 5th edition , p. 60. –

+0

@ YiboYang main.cpp가 어떻게 한 번에 액세스하나요? 또한, 모든 사람들이 당신과 같은 책을 가지고 있다고 가정하지 말고, 당신이 뭔가를 참고할 때 그것이 온라인과 무료로 접근 할 수 있는지 확인하십시오. –