c++ “使用命名空间”究竟做了什么?

以下C测试代码不链接(gcc 4.9.2,binutils 2.25)。错误是In函数’main’:未定义的引用’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变量。我相信,在全局命名空间中声明和定义了一个不相关的测试变量,因此链接错误。

问题:任何人都可以解释为什么我的期望是不正确的,究竟发生了什么?

不是答案:

>我可以使链接更改第10行到std :: string X :: test =“Test”;.
>我不应该使用“using namespace”来开始。

最佳答案
该命令使用命名空间X;使命名空间X中的名称在包含该指令的命名空间内可见。也就是说,当在该范围内查找名称n时,可以找到X :: n。但是,只有编译器需要查找才会被查找。

在你的例子中,这个声明:

std::string test = "Test";

在全球命名空间内部就是完美的。名称测试简单介绍,和任何其他声明一样。无需在任何地方查找。

这将是一个完全不同的水壶:

namespace X
{
  struct C
  {
    static std::string test;
  };
}

using namespace X;
std::string C::test = "Test";

在这段代码中,编译器需要知道C是对C :: test的定义有意义的。因此,它执行C的名称查找,它确实发现X :: C感谢using指令。

转载注明原文:c++ “使用命名空间”究竟做了什么? - 代码日志