为什么在使用命名空间指令时没有为函数添加命名空间?

Why no namespace prepended for function when using namespace directive?

这个 C++ 文件...

namespace foo {
    class C {
        void m();
    };
    void f();
}

using namespace foo;

void C::m() {}
void f() {}

..编译为具有以下符号的目标文件:

$ g++ foo.cpp  -c
$ nm foo.o  -C
000000000000000a T f()
0000000000000000 T foo::C::m()

为什么 C::m()? 得到前缀的命名空间,而不是 f()

(我使用 namespace foo {...} 而不是 using namespace foo,然后两个名称都有 foo 前缀。

void C::m() {}中,C::m是一个限定名,这样的定义总是引用之前声明的东西。编译器查找 C,发现 C 实际上是 foo::C,感谢 using-directive,它需要 void C::m(){}作为 foo::C::m().

的定义

当你写void f() {}时,那是一个非限定名称,它总是在当前命名空间中声明函数,也就是全局命名空间。