为什么在使用命名空间指令时没有为函数添加命名空间?
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() {}
时,那是一个非限定名称,它总是在当前命名空间中声明函数,也就是全局命名空间。
这个 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() {}
时,那是一个非限定名称,它总是在当前命名空间中声明函数,也就是全局命名空间。