0

如您所知,常量默认为内部链接。

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

Buf 可以在头文件中定义,它仅在定义它的文件中可见,并且在链接时不能被其他翻译单元看到。

但是,如果一些复杂的结构常量定义如下:

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

复杂类定义:

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

谁能解释这个问题?提前致谢。

4

1 回答 1

0

内部联动并不意味着没有存储。相反,这意味着该变量在其他翻译单元中不可见。

在 C++const中,允许编译器为变量创建存储或不创建存储。是否这样做取决于它是否需要它。

因此,在您的示例中,编译器仅在需要时才创建存储myObject(它可能会这样做),因为它是const. 也因为它是const,也将具有内部链接,这意味着如果需要存储myObject,每个翻译单元将拥有自己的副本。myObject

您可以做一个简单的测试来查看它的实际效果,即获取myObject多个不同翻译单元中的地址(有效地在不同的 cpp 文件中)并将其打印出来。这将做两件事:强制创建存储,myObject即使它尚未创建;由于内部链接,您将看到两个不同的地址。

于 2013-12-10T13:13:30.953 回答