在匿名命名空间中使用命名空间是安全的吗?

4
"匿名命名空间内使用namespace语句"中,是否合法?
//file.cpp
//....
namespace
{
    using namespace std;
}

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

答案是 "是"。 此外,即使在cpp文件中插入命名空间指令,由于统一构建的引入,头文件和实现文件之间的作用域差异也不是非常牢固,因此通常被鄙视(参见https://dev59.com/lmw15IYBdhLWcg3wpNcB#6474774)。
我的问题是: 匿名命名空间是否可以使我免受这些问题的困扰,或者使用指令是否仍然会传播文件边界? 在https://dev59.com/C0zSa4cB1Zd3GeqPrPzG#2577890中提出了类似的方法。 匿名命名空间也适用吗? 它真的很安全吗? 当然,std是一个糟糕的例子,但例如using namespace boost::assign;在某些cpp文件中会非常方便。

namespace assign = boost::assign 更安全。我只使用 using namespace 将用户定义的字面量引入作用域,因为没有其他选择。 - R. Martinho Fernandes
@R.MartinhoFernandes:使用boost::assign并不能为您带来任何简写,因为该命名空间包含容器的+=等运算符。因此,您必须在某个地方放置using,但是不可否认,函数作用域更好。 - Martin
2个回答

9
将其放在匿名命名空间中和将其放在命名空间外部之间没有任何区别。两者都产生相同的效果,即将整个std命名空间引入您的文件的顶级命名空间。这并不好,应该避免。
至于“传播文件边界”,如果将其放在匿名命名空间之外,它也不会这样做。唯一可能感染其他文件的时候是,当它在其他文件中被#include,例如头文件。

2
我的问题是:匿名命名空间是否可以使我免于这些问题,或者使用指令仍可传播文件边界? 只有当其他文件有“#include"file.cpp"”预处理器指令时,该指令才会传播文件边界。这也是完全合法的,但是这真的很糟糕。与头文件相比,包含源文件违反了标准惯例。 仅仅因为某些东西是合法的,并不意味着它是好的。 基本上,使用“using”将其他命名空间带入当前命名空间也是如此。“using namespace;”甚至在源文件中也被认为是不好的形式。

+1,"哇噢,那太糟糕了。"这刚刚让我笑了一整个早上。 - Martin
1
顺便说一句,当你使用Unity构建时,“include cpp”恰好是你需要做的。不过,只要不是真正需要,我认为这并不健康。 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接