3

尝试在 c++ 对象上使用 extern 时出现未定义的引用错误。整数类型似乎不会发生这种情况。我错过了什么?!下面的代码复制了这个问题:

文件 1.cpp:

#include <string>

const std::string s("test");
int i = 99;

int main()
{
        extern void Test();
        Test();
}

文件 2.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上还有其他类似的问题,但它们似乎都与没有定义变量的人有关,我就是!

4

2 回答 2

4

它是conston std::string,它提供s内部链接。引用自[3.5 程序和链接]:3:

具有命名空间范围 (3.3.6) 的名称如果是

—显式声明为 const或 constexpr 且既未显式声明 extern 也未先前声明具有外部链接的变量;或者

于 2012-10-03T02:53:02.787 回答
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”。

于 2012-10-03T02:37:27.243 回答