C++ 外部常量字符串的链接错误
我遇到了以下链接问题 在第一个编译单元中,我在全局空间e中定义了一个C++ 外部常量字符串的链接错误,c++,gcc,visual-c++,hyperlink,C++,Gcc,Visual C++,Hyperlink,我遇到了以下链接问题 在第一个编译单元中,我在全局空间e中定义了一个const string,如下所示: const string test_string = "blahblah"; 后来,在一个2dn编译单元中,我想重用该字符串,并编写了: extern string test_string; 但是链接过程失败了(未定义的符号),我发现链接的唯一方法是使用const char*而不是const string 我想了解为什么会发生这种情况?首先,string和const string是不同的
const string
,如下所示:
const string test_string = "blahblah";
后来,在一个2dn编译单元中,我想重用该字符串,并编写了:
extern string test_string;
但是链接过程失败了(未定义的符号),我发现链接的唯一方法是使用const char*
而不是const string
我想了解为什么会发生这种情况?首先,
string
和const string
是不同的类型。因此,test\u string
的两个声明永远不会匹配
不过,还有一个问题。声明的变量const
,而不是显式声明的extern
,具有内部链接(这基本上意味着它是隐式的静态的
)
通常,如果您想在翻译单元之间共享一个常量,您可以在标题中定义它,并将其包含在所有翻译单元中;然后,它们中的每一个都会得到自己的相同副本
如果您确实想要共享它的单个实例,则在第一个单元中定义时,必须将变量标记为外部链接:
extern const string test_string = "blahblah";
然后,您可以声明它以从第二个单元访问它:
extern const string test_string;
同样,不要忘记常量
,因为类型必须匹配
至于为什么它与常量字符一起工作*;在这里,
const
适用于指向的字符,而不是指针。因此指针本身具有正常的外部链接。如果您使用const char*const
可以发布您正在使用的gcc
命令吗?事实上,“missing”const
是post中的一个错误,但是您的答案非常清楚!