【问题标题】:Is using namespace in an anonymous namespace safe?在匿名命名空间中使用命名空间安全吗?
【发布时间】:2012-05-02 15:37:18
【问题描述】:

"using namespace" statement inside an anonymous namespace被问到以下是否合法

//file.cpp
//....
namespace
{
    using namespace std;
}

int a(){
 cout << "bla";
}

答案是“它是”。此外,即使将命名空间指令插入到 cpp 文件中,通常也会鄙视使用命名空间指令,因为自从引入统一构建 (https://stackoverflow.com/a/6474774/484230) 以来,头文件和实现文件之间的范围差异并不是坚如磐石。

我的问题: 匿名命名空间是否可以使我免于此类问题,或者可以使用 指令仍然传播文件边界? 在https://stackoverflow.com/a/2577890/484230 中提出了类似的方法。它也适用于匿名命名空间吗?它真的安全吗? 当然std 是一个不好的例子,但是例如using namespace boost::assign; 在某些 cpp 文件中会非常方便。

【问题讨论】:

  • namespace assign = boost::assign 更安全。我只使用using namespace 将用户定义的文字带入作用域,因为没有其他选择。
  • @R.MartinhoFernandes: 使用 boost::assign 简写不会给你带来任何好处,因为命名空间包含了容器的 += 等运算符。因此,您必须将 using 放在某个地方,但不可否认,功能范围更好。

标签: c++ namespaces using-directives


【解决方案1】:

将其放入匿名命名空间和将其置于匿名命名空间之外没有任何区别。任何一种都会产生相同的效果,即将整个 std 命名空间带入文件的顶级命名空间。这不好,应该避免。

至于“传播文件边界”,如果你把它放在匿名命名空间之外,它也不会这样做。它唯一可以感染其他文件的情况是它位于其他文件中的#included 文件中,例如标题。

【讨论】:

    【解决方案2】:

    我的问题:匿名命名空间是否可以帮助我避免此类问题,或者 using 指令仍然可以传播文件边界?

    该指令传播文件边界的唯一方法是其他文件是否具有#include "file.cpp" 预处理器指令。这也是完全合法的,但是哇哦,那很臭。包含源文件而不是标头非常违反标准做法。

    仅仅因为某件事是合法的并不意味着它是好的。

    使用using 将其他命名空间引入当前命名空间的情况几乎相同。 using namespace &lt;name&gt;; 通常被认为是错误的形式,即使在源文件中也是如此。

    【讨论】:

    • +1 表示“哎呀,太臭了。”这让我“早上笑了”
    • 顺便说一句,include cpp 正是您在使用统一构建时需要做的。并不是说只要不是真的需要它,我就认为它是健康的。
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多