extern const字符串的链接错误

时间:2016-06-23 07:38:07

标签: c++ gcc visual-c++ hyperlink

我遇到了以下链接问题。

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

const string test_string = "blahblah";

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

extern string test_string;

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

我想了解它为什么会发生?

1 个答案:

答案 0 :(得分:4)

首先,stringconst string是不同的类型。所以test_string的两个声明永远不会匹配。

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

通常情况下,如果你想在翻译单元之间共享一个常量,你可以在一个标题中定义它并在所有标题中包含它;然后他们每个人都会得到自己的相同副本。

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

extern const string test_string = "blahblah";

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

extern const string test_string;

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

至于为什么它与const char *一起使用;在那里,const适用于指向的字符,而不是指针。因此指针本身具有正常的外部链接。如果您已将string设为const char * const,则会收到与[alias] fnm = !git fetch upstream && git merge --no-log --no-ff --no-commit upstream/branch && git reset file/path/not/to/be/updated && git checkout file/path/not/to/be/updated 相同的错误。