非头文件中编写的using namespace作用域是否到源文件末尾?
解答
写在非头文件的源文件全局位置的using namespace声明,作用域确实会在当前源文件末尾终止,不会泄漏到其他编译单元。
C++中每个.cpp文件(连带其引入的所有头文件展开内容)是独立的编译单元,不同编译单元的全局域声明默认互不影响。你在foo.cpp全局位置写的using namespace foo,只会对当前编译单元中该声明之后的所有代码生效,编译完当前文件后这个导入规则就失效了,不会影响其他.cpp的编译。
至于要不要手动加块作用域限制生效范围,看你的实际需求:
- 如果你希望整个源文件后续代码都可以省略该命名空间前缀,那完全不需要额外加作用域包裹
- 如果你只希望某一段代码可以省略命名空间前缀,不影响源文件后面的其他代码,就可以用你示例里的花括号包裹的写法,
using namespace bar的生效范围就只会局限在花括号对应的块作用域内,出了括号就会失效。
额外提醒:千万不要在头文件的全局位置写using namespace,所有引入这个头文件的编译单元都会被强制导入对应的命名空间,极容易引发命名冲突,属于C++开发的常见不良实践。
内容的提问来源于stack exchange,提问作者Fayeure
相关产品推荐
相关产品推荐

