不建议使用 using namespace

故事

最近稣在梳理一份 Google C++ Coding Style 的更严格版本,其中,有一条是“在大范围禁止使用 using namespace”,结果获得 100% 员工的支持。员工人数:1!

分析

具体来说,大范围指的是比函数更大的范围。通常的 Coding Style 可能会提到:禁止在头文件里使用 using namespace,而这里的禁止显然涉及的地方更多。禁用它的理由通常有以下这些:

  1. 降低可维护性:using namespace 会降低代码的可读性,因为它隐藏了实体的来源,读者需要额外的工作来确定一个名称属于哪个命名空间。如果后续添加或修改了同名的实体,可能导致编译失败,甚至可能引入难以发现的错误。

  2. 降低编译性能:using namespace 可能会导致编译器查找符号时的性能下降,因为它需要在所有导入的命名空间中搜索。

同时,我们放开了例外的限制,没错,您可以在任何地方,比如头文件里,使用 using namespace 各种 std::literals

如果您觉得不使用 using namespace,会导致需要写大量很长的 namespace,那您应该使用 namespace 定义别名来缩短,如果是本项目的 namespace 倾向于使用最短的简称。例如:

1
2
3
4
5
6
namespace d = umutech::regame::diagnostics; // 自己的命名空间,尽量短
namespace fs = boost::filesystem;
namespace nw = boost::nowide;
namespace po = boost::program_options;

using namespace std::string_view_literals; // 例外
如果您使用微信,也可以关注公众号 UMU618,在公众号文章里评论。