C++中using namespace与namespace扩展的区别及命名查找疑问
关于C++命名空间定义块与
using namespace的核心区别 先解释第一个场景的疑问
A.h中的命名空间定义:
namespace org::lib{ bool xyz = true; }
B.cpp中的代码:
#include "A.h" namespace org::lib { void function() { if (lib::xyz){ //.... } } }
这里lib::xyz能找到变量的原因是:C++会将命名空间的名称注入到自身作用域中。当你在org::lib的命名空间定义块内部时,lib这个标识符直接指代org::lib本身,所以lib::xyz等价于org::lib::xyz,自然匹配到了定义好的变量,而不是去查找不存在的org::lib::lib子命名空间。
两种写法的本质区别
这两种写法完全不是一回事,核心差异如下:
1. namespace org::lib { ... }:直接在目标命名空间内定义成员
- 这个写法是进入
org::lib命名空间的作用域,你写的所有代码都属于这个命名空间的一部分(比如例子里的function会成为org::lib的成员函数) - 内部可以通过注入的命名空间名称(比如
lib)直接指代当前命名空间 - 所有未限定的标识符会优先在
org::lib中查找
2. using namespace org::lib;:将命名空间成员导入当前作用域
修改后的B.cpp代码:
#include "A.h" using namespace org::lib; namespace{ void function() { if (lib::xyz){ //.... } } }
这里lib::xyz无法识别的原因是:
using namespace只是把org::lib里的所有成员(比如xyz)导入到当前作用域(这里是全局作用域),让你可以直接用xyz而不用加限定- 它不会导入
lib或org这些命名空间本身的名称,所以编译器找不到lib这个标识符 - 你的代码仍然处于原来的作用域(例子里的匿名命名空间),并没有进入
org::lib的作用域
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

