如您所知,常量默认为内部链接。
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
创建存储,即使它还没有;由于内部链接,您将看到两个不同的地址。