【发布时间】:2016-03-11 19:03:47
【问题描述】:
以下 C++ 测试代码未链接(gcc 4.9.2、binutils 2.25)。错误是In function 'main': undefined reference to 'X::test'。
01: #include <string>
02: #include <iostream>
03:
04: namespace X
05: {
06: extern std::string test;
07: };
08:
09: using namespace X;
10: std::string test = "Test";
11:
12: int main()
13: {
14: std::cout << X::test << std::endl;
15: }
由于第 09 行,我希望第 10 行定义在第 06 行声明的 X::test 变量。我相信相反,在全局命名空间中声明和定义了一个不相关的 test 变量,因此出现链接错误。
问题:谁能解释一下为什么我的预期不正确,究竟发生了什么?
不是答案:
- 我可以将第 10 行更改为
std::string X::test = "Test";。 - 我不应该使用“使用命名空间”开头。
【问题讨论】:
-
既然你说在命名空间
extern内,它会在命名空间外寻找它。它没有在命名空间内定义,编译器也找不到它,Undefined reference。向您提出的问题:为什么它需要是外部的? -
@wouter140:
extern与“在命名空间之外寻找东西”无关。它只是意味着“这是在其他地方(外部)定义的”。 -
@curiousguy 字面意思是“其他地方”,或者实际上是其他任何地方。它只是意味着“这只是一个声明,而不是一个定义。”
-
也许你可以发布没有行号的代码,或者在 cmets 中使用数字。不是每个人都使用允许矩形选择的文本编辑器(就像 vim 和 emacs 一样)。
-
@curiousguy 和 Notepad++ 一样(也可以命名一个非主要的 Unix 世界编辑器)。
标签: c++ scope namespaces forward-declaration using-directives