为什么这种复杂的结构常数是内部联系

时间:2013-07-09 02:55:09

标签: constants linker-errors linkage external-links internal-link

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

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

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

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

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

complexClass定义:

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

任何人都可以解释这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

内部链接并不意味着没有存储空间。相反,它意味着变量在其他翻译单元中不可见。

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

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

您可以执行的简单测试是将myObject的地址放在许多不同的翻译单元中(实际上在不同的cpp文件中)并将其打印出来。这将做两件事:强制为myObject创建存储,即使它尚未存在;由于内部联系,你会看到两个不同的地址。