如您所知,常量默认为内部链接。
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
任何人都可以解释这个问题吗?提前谢谢。
答案 0 :(得分:0)
内部链接并不意味着没有存储空间。相反,它意味着变量在其他翻译单元中不可见。
在C ++中const
允许编译器为变量创建存储空间。是否这样做取决于它是否需要它。
因此,在您的示例中,编译器将仅在需要时(它可能会执行)为myObject
创建存储,因为它是const
。另外,因为它是const
,myObject
也会有内部链接,这意味着如果需要存储,每个翻译单元都会拥有自己的myObject
副本。
您可以执行的简单测试是将myObject
的地址放在许多不同的翻译单元中(实际上在不同的cpp文件中)并将其打印出来。这将做两件事:强制为myObject
创建存储,即使它尚未存在;由于内部联系,你会看到两个不同的地址。