尝试在c ++对象上使用extern时,我收到了未定义的引用错误。整体类型似乎不会发生这种情况。我错过了什么?!下面的代码复制了这个问题:
file1.cpp:
#include <string>
const std::string s("test");
int i = 99;
int main()
{
extern void Test();
Test();
}
file2.cpp:
#include <iostream>
#include <string>
extern const std::string s;
extern int i;
void Test()
{
std::cout << s << std::endl;
std::cout << i << std::endl;
}
如果我注释掉's'std :: string变量的用法,那么链接错误就会消失。
关于SO的其他问题与此类似,但它们似乎都与未定义变量的人有关,我就是这样!
答案 0 :(得分:4)
它是const
上的std::string
,它提供了s
内部链接。引自[3.5程序和链接]:3:
具有命名空间范围(3.3.6)的名称具有内部链接(如果是)
的名称- 一个显式声明为const 或constexpr的变量 既没有明确声明extern也没有声明过 外部联系;或
答案 1 :(得分:2)
如果你删除const,它在vc ++中工作,如果你定义它们都是extern const,它也可以工作。
// file1.cpp
extern const std::string s("test");
extern const int i = 99;
// file2.cpp
extern const std::string s;
extern const int i;
如果从file1.cpp中删除任何'extern',则无法编译。如果变量定义为const,则可以从file1.cpp中删除“extern”。