2010-12-28 7 views
3

extern const 또는 extern을 헤더 파일에서 같은 것으로 선언하고 있습니까? 또한 외부 연결을 제공 할 것인가?글로벌 extern const 설명

globals.cpp

#include <string> 

extern const std::string foo = "bar"; 

globals.h

#ifndef GLOBALS_H 
#define GLOBALS_H 

#include <iostream> 

extern const std::string foo; 

#endif /* GLOBALS_H */ 

또는

globals.h

#ifndef GLOBALS_H 
#define GLOBALS_H 

#include <iostream> 

extern std::string foo; 

#endif /* GLOBALS_H */ 

모두 컴파일과 잘 실행, 모두 같은 주소 때 제공 m에서 사용됨 ultiple 파일, 어느 것이 더 정확합니까?

+0

"더 정확합니다"라는 질문은 없습니다. 그 중 하나는 실제로 부정확하며 foo가 실제로 사용되면 오류가 발생합니다. 아래 내 대답을 참조하십시오. –

+0

나는 다른 파일에서 coo foo.c_str()을 수행했지만 여전히 컴파일하고 실행합니다. 이상한. –

+0

잘못된 것 같습니다. 더 복잡한 작업이 있거나 컴파일러/링커가 선언을 잘 검사하지 못합니다. 이 파일 중 하나에서 foo를 수정하려고하면 어떻게됩니까? 예 : foo.clear();를 수행합니까? 괜찮아? 그렇다면 헤더에 "const"버전을 사용하면 여전히 컴파일됩니까?(여전히 컴파일하는 경우 파일이보고있는 헤더의 선언이 아닐 것입니다.) –

답변

3

이 하나가 올바른지,

//globals.h 

extern const std::string foo; //Consistent 

일관된!

+0

에서 foo를 어디에 초기화해야합니까? –

+0

'.cpp' 파일에서; 또한,'.cpp' 파일에는'extern'이 필요 없습니다. – Nawaz

+0

유감 스럽지만 올바른 결과를 얻기 위해 노력하고 있습니다.'.cpp' 파일의'foo = "abs"와 같은 sth가 유효할까요? 그렇지 않다면 어떻게 초기화해야합니까? 한 가지 더, 클래스와 함께 사용되는 'extern'은 무엇입니까? –

1

예제에서와 같이 const 외부 연결을 지정할 수 있지만 여전히 수정할 수는 없습니다 (상수). 오후 8시 30 분 P.S. <iostream>

P.P.S.이 아닌 <string>을 포함해야합니다. 내가 명확하지 않다면, 당신은 const-ness를 재정의 할 수 없다. 이 컴파일되지 않습니다 :

extern std::string foo; 
extern const std::string foo = "bar"; 
+0

의도 한대로입니다. 그러나 어떤 헤더 파일이 맞습니까? 이유는 std :: string과 std :: cout을 모두 포함 할 수 있도록 iostream을 넣어 두었습니다. –

+0

무엇을 의미합니까? const 또는 non-const를 일관성있게 사용한다면 둘 다 정확합니다. const를 한 곳에서 정의하고 다른 곳에서 const를 정의 할 수 없습니다. –

+0

iostream은 문자열 헤더 –

1

올바른 사람은

extern const std::string foo; 

foo 소스가에서 정의 파일에서 상수 문자열입니다, 그래서 extern 선언은 인스턴스를 잡을 수있는 컴파일러도이를 표시 허용해야하는 위치 소스 파일 위치를 내 코드 해당 헤더가 포함되어 있으면 foo을 수정하려고 할 수 있습니다.

+0

빠른 답변과 설명 주셔서 감사합니다 :) –

1

둘 다 잘 컴파일 된 유일한 이유는 실제로 foo를 사용하지 않는다는 것입니다. 따라서 링커가 foo를 찾을 수 있는지 여부는 중요하지 않습니다 (절대로 시도하지 않습니다). (또는 귀하의 컴파일러/링커 쓰레기입니다. :)

일관된 헤더 괜찮습니다. const가 누락 된 것은 없으며 뭔가가 foo를 사용하려고하면 오류가 발생합니다.

globals.h를 포함하는 일부 파일 (globals.cpp 아님)을 만들고 foo를 사용하려고하면 (예 : "foo.c_str();"행을 함수에 추가하면) const std::string foo을 찾을 수 없기 때문에 링크 오류가 발생했습니다.

이렇게해야합니다. 헤더는 foo를 사용하고자하는 모든 것을 말하고 있으며, 단지 그것을 읽을 수만 있고 변경할 수는 없다. globals.h 헤더를 포함하는 것은 globals.cpp 내부에 무엇이 있는지 전혀 알지 못합니다. 객체를 const로 취급하기를 원하면 해당 정보를 포함하는 파일에 저장해야합니다.