外部常量字符串的链接错误

Linkage error of extern const string

本文关键字:链接 错误 字符串 常量 外部      更新时间:2023-10-16

我遇到了以下链接问题。

在第一个编译单元中,我在全局空间 e 中定义如下const string

const string test_string = "blahblah";

后来,在 2dn 编译单元中,我想重用该字符串,我写道:

extern string test_string;

但是链接过程失败(未定义的符号),我发现链接的唯一方法是使用const char*而不是const string.

我想了解为什么会这样?

首先,stringconst string是不同的类型。因此,test_string的两个宣言永远无法匹配。

不过,还有一个问题。声明为const且未显式声明extern的变量具有内部链接(这基本上意味着它是隐式static)。

通常,如果要在翻译单元之间共享一个常量,则可以在标头中定义它并将其包含在所有翻译单元中;然后每个翻译单元都将获得自己的相同副本。

如果你真的想共享它的单个实例,你必须在第一个单元中定义变量时标记外部链接:

extern const string test_string = "blahblah";

然后,您可以声明它以从第二个单元访问它:

extern const string test_string;

同样,不要忘记const,因为类型必须匹配。

至于为什么它适用于const char *;在那里,const适用于指向的字符,而不是指针。所以指针本身具有正常的外部链接。如果您将其const char * const,则会遇到与string相同的错误。