我遇到了以下链接问题。
在第一个编译单元中,我在全局空间e中定义const string
,如下所示:
const string test_string = "blahblah";
后来,在2dn编译单元中,我想重用那个字符串,我写道:
extern string test_string;
但链接过程失败(未定义的符号),我发现链接的唯一方法是使用const char*
而不是const string
。
我想了解它为什么会发生?
答案 0 :(得分:4)
首先,string
和const 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
相同的错误。