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

Why no namespace prepended for function when using namespace directive?

本文关键字:命名空间 函数 添加 指令 为什么      更新时间:2023-10-16

这个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()没有?

(如果I用namespace foo {...}代替using namespace foo,则两个名称前都有foo)。

void C::m() {}中,C::m是一个限定名,这样的定义总是指先前声明的东西。编译器查找C,由于using指令,发现C实际上是foo::C,并将void C::m(){}作为foo::C::m()的定义。

当您编写void f() {}时,这是一个非限定名,并且它总是在当前命名空间(即全局命名空间)中声明该函数。