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

时间:2012-05-02 15:37:18

标签: c++ namespaces using-directives

"using namespace" statement inside an anonymous namespace中,有人问以下是否合法

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

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

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

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

2 个答案:

答案 0 :(得分:8)

将它放在匿名命名空间中并将其放在一个命名空间之间没有任何区别。两者都产生相同的效果,这会将整个std命名空间带入文件的顶级命名空间。这不好,应该避免。

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

答案 1 :(得分:2)

  

我的问题:匿名命名空间是否使我免于此类问题,或者using指令是否仍然传播文件边框?

指令传播文件边框的唯一方法是,如果某个其他文件具有#include "file.cpp"预处理程序指令。这也是完全合法的,但不管怎么说,这很糟糕。包含源文件而不是标题非常违反标准做法。

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

使用using将一些其他命名空间带入当前命名空间几乎同样如此。 using namespace <name>;即使在源文件中也被视为不良格式。