2014-09-22 4 views
1

이 문제에 대한 여러 게시물을 보았지만 그 중 아무 것도 내 관심사를 잘 설명하지 못하므로 여기서 이해할 수있는 부분을 설명하고 잘못된 부분을 수정하십시오.Extern 및 const in C++

//definitions.h 
extern const float fallingTime; 

지금, 나는이 선언을 사용하려면 두 개의 소스 파일이 :

나는 다음과 같은 선언 헤더 파일이 있다고 가정.

//source1.cpp 
#include "definitions.h" 
const float fallingTime = 0.5f; 
//use fallingTime 

//source2.cpp 
#include "definitions.h" 
//just use fallingTime (no definition required) 

이것은 내가하는 일입니다. 하지만 지금은이 다른 방법으로 진행하겠습니다. 나는 여러 소스를 읽고 결론을 내렸다

//definitions.h 
const float fallingTime = 0.5f; //Note that I don't use extern now 

//source1.cpp 
#include "definitions.h" 
//just use fallingTime (no definition required) 

//source2.cpp 
#include "definitions.h" 
//just use fallingTime (no definition required) 

으로는 메모리와 컴파일 시간을 절약하는 메모리 할당은 후자 반면, (source1.cpp 모두의 정의)를 발생하기 때문에, 이전 방식의 장점이며, Approach 메모리 할당은 definitions.h (source1.cpp 및 source2.cpp)를 포함하는 모든 소스 파일에서 발생합니다. 그 맞습니까?

마지막으로, extern을 사용하고 상수를 동시에 정의하는 것은 무엇을 의미합니까? 이전 접근 방식과 동등한가? fallingTime에 대한 주소가 없습니다로

//definitions.h 
extern const float fallingTime = 0.5f; 
+0

체크 아웃 const에 대한 외부 및 내부 연결. – Sumeet

+0

네, 맞습니다 .. –

+0

또한 컴파일러에 따라 달라집니다 .. –

답변

1

const float fallingTime = 0.5f;이 헤더에 정의되어있는 경우 변환 단위는 바이너리의 데이터 섹션에 값을 저장하거나 저장하지 않을 수 있습니다.

변환 단위의 코드가 fallingTime에 대한 주소 또는 참조를 취하지 않으면 컴파일러가 데이터 섹션에 값을 할당 할 이유가 전혀 없습니다. 컴파일러는 fallingTime의 사용을 해당 값으로 바꿀 가능성이 높습니다. 왜냐하면 그 정의가 컴파일 타임에 모든 번역 단위에서 사용 가능하기 때문입니다.

extern const으로 생성 된 코드는 fallingTime 값을 정의하는 변환 단위가 아닌 다른 변환 단위에서 컴파일 타임에 사용할 수 없으므로 메모리에서 fallingTime 값을로드해야합니다.

+0

그런 상황에서 두 가지 방법 모두 메모리와 컴파일 시간이 동일하다고 말하고 있습니까? –

+0

@FrancisMoy 답변을 업데이트했습니다. –

+0

좋아, 내 추측은 착각이났다. 그런 다음, 두 번째 접근법이 컴파일 시간/메모리 관점에서 더 최적 일 수 있다면, 일반적으로 첫 번째 접근 방식이 가장 좋은 방법으로 제안되는 이유는 무엇입니까? extern을 상수로 사용하면 어떤 점이 유리합니까? 두 번째 접근법의 유일한 문제점은 @TomTanner에 의해 설명되는 문제일까요? –

-2

후자의 문제는 C++에 앞서 11 C++로 아래 컴파일러에 따라 것입니다, 당신은 linktime 오류를 얻을 수 있습니다. 언어 을 필요로합니다. 정확하게 하나의 번역 단위로 인스턴스화하고 특히 gcc는 매우 엄격합니다.

+0

죄송합니다. 이해하지 못했습니다. "후자"와 함께 extern과 정의를 함께 사용 하시겠습니까? –

+0

@FrancisMoy "이 다른 방식으로 진행한다고 가정하십시오" –

+0

extern (외부 연결)을 사용하면 상수에 메모리 주소가 지정됩니다.이 주소는 참조 또는 주소를 가져 오는 데 필요할 수 있습니다. 상수, 맞지? –