0

아시다시피 상수는 내부 연결로 기본 설정됩니다.이 복잡한 구조 상수는 내부 링크입니다.

const int Buf = 1000; // defaults to internal linkage 

buf에이 헤더 파일에서 정의 할 수 있습니다, 그것은 단지가 정의되고 다른 번역 단위로 링크시 볼 수없는 파일 내에서 볼 수 있습니다. 몇 가지 복잡한 구조 상수는 다음과 같이 정의 된 경우

그러나 :

- constants.h 
const complicatedClass myObject("I'm a const object","internal linkage",5); 

complicatedClass 정의 :

class complicatedClass 
{ 
private : 
    char* charArry; 
    std::string strTemp; 
    static int numbers; 
    int mSize; 

public: 
    complicatedClass(); 
    complicatedClass(char* pChrArry, std::string temp, int size); 
    ~complicatedClass(); 

public: 
    void print() const; 
    std::string getStrTemp() const; 
}; 

는 그 컴파일이 복잡한 구조 상수의 저장을 작성해야합니다 것, 따라서 외부해야 결합. 그러나이 상수 헤더 파일 (constants.h)이 여러 파일에 포함되어 있으면 모든 것이 정상입니다. 링커 오류가 제기되어야한다고 가정하고, myObject를 여러 위치에 여러 파일로 정의해서는 안됩니다.

누구든지이 문제를 설명 할 수 있습니까? 미리 감사드립니다.

+0

이 링크의 "헤더 파일의 const"섹션을 참조하십시오. http://www.mi.uni-koeln.de/c/mirror/www.codeguru.com/cpp/tic/tic_html.zip/ tic0092.html – yao

+0

은 분명하지 않습니다. 누구라도이 사건을 도울거야? – yao

답변

0

내부 연결은 저장소가 없음을 의미하지 않습니다. 오히려 변수가 다른 번역 단위에서 보이지 않음을 의미합니다.

C++ const에서 컴파일러는 변수에 대한 저장소를 만들 수 있습니다. 그것이 그것의 필요성 여부에 달려 있습니다.

예에서 컴파일러는 const이기 때문에 필요한 경우에만 myObject에 대한 저장소를 만듭니다 (아마도 그렇게 할 것입니다). 또한 const이기 때문에 myObject도 내부 연결을 갖게됩니다. 즉, 저장이 필요한 경우 각 번역 단위에 myObject의 자체 복사본이 있음을 의미합니다.

실전에서 이것을 확인하기 위해 할 수있는 간단한 테스트는 myObject의 주소를 다양한 번역 단위 (효과적으로 다른 cpp 파일에 있음)로 가져 와서 인쇄하는 것입니다. 이것은 두 가지 작업을 수행합니다 : 강제 저장 장치가 아직 생성되지 않은 경우에도 myObject에 대해 생성되도록합니다. 내부 연결 때문에 두 개의 다른 주소가 표시됩니다.