在c ++对象上使用extern时的未定义引用,但不是整数类型

时间:2012-10-03 02:24:53

标签: c++ gcc

尝试在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的其他问题与此类似,但它们似乎都与未定义变量的人有关,我就是这样!

2 个答案:

答案 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”。