4

匿名命名空间内的“使用命名空间”语句中,询问以下内容是否合法

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

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

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

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

4

2 回答 2

9

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

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

于 2012-05-02T15:41:49.703 回答
2

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

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

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

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

于 2012-05-02T15:51:15.850 回答