头文件中禁止使用using namespace std;,必须用std::全限定名;.cpp文件中仅允许在函数内局部使用using std::xxx;;全局或命名空间级using指令一律禁用;辅助符号应置于匿名命名空间而非static。

头文件里写using namespace std;会直接污染所有包含它的源文件
这不是风格问题,是编译错误的潜在源头。一旦某个头文件写了这行,所有#include它的.cpp文件都会把整个std命名空间拖进全局作用域——swap、size、move这些高频名立刻变成冲突高危点。你改一个头文件,可能让五个模块编译失败,而错误提示里根本不会告诉你源头在哪。
替代方案:只在.cpp里用using声明,且必须限于局部作用域
真正安全的做法不是“少用”,而是“精准引入+作用域收束”。全局或命名空间级的using指令一律禁止,哪怕只在.cpp里也不行。
-
using std::string;或using std::vector;可以放在函数内部(比如main()开头),但不能放在.cpp文件顶部的全局区 - 如果函数体较长,建议把
using声明放在最靠近使用位置的代码块内,避免作用域意外扩大 - 对模板或ADL敏感的函数(如
swap),不引入也能正常调用——编译器靠参数类型自动找到std::swap,无需手动暴露
头文件中必须始终用std::全限定名
这是唯一零风险写法。虽然多敲几个字符,但能立刻消除歧义、防止污染、方便代码审查。
-
std::vector、std::shared_ptr、std::optional——全部带前缀,不妥协 - 别依赖“反正就这几个标准类型,不会冲突”——第三方库(如Boost、Abseil)和自定义工具类常复用
string、optional等名字 - 嵌套命名空间也一样:
std::chrono::steady_clock不能简写成steady_clock,哪怕只用一次
用匿名命名空间替代static,顺便规避全局污染
头文件里不该有static全局变量或函数,但有时需要“仅本文件可见”的辅助逻辑。这时候static语义模糊,而匿名命名空间才是现代C++的明确解法。
立即学习“C++免费学习笔记(深入)”;
- 把
static int helper_counter = 0;改成namespace { int helper_counter = 0; } - 它提供内部链接(internal linkage),效果等同
static,但更符合命名空间设计本意 - 匿名命名空间里的符号不会泄漏到全局,也不会被其他编译单元看到,天然免疫污染问题
最容易被忽略的是:头文件中哪怕只有一处using namespace std;,就足以让整个项目命名空间失控。它不像运行时错误那样容易复现,而是在你合并分支、升级依赖或添加新模块时突然爆发——那时再追溯,成本远高于一开始就写死std::前缀。


















