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



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

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 不应该在很多地方定义(在多个文件中(

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

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

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

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

要看到这一点,您可以做的一个简单的测试是将myObject的地址放在许多不同的翻译单元中(实际上是在不同的 cpp 文件中(并将其打印出来。这将做两件事:强制为myObject创建存储,即使它还没有;由于内部链接,您将看到两个不同的地址。

相关内容

  • 没有找到相关文章

最新更新