是否可以在头文件中使用“using namespace”语句?

时间:2014-01-29 05:40:53

标签: c++ coding-style namespaces

许多程序员告诉我,在头文件中有一个using namespace <x>语句是个坏主意。我一直盲目地遵循这个建议,直到现在却不明白为什么会如此。现在我正在开发一个包含大量命名空间的非常复杂的项目。有时我发现在开头告诉编译器关于命名空间而不是每次都要输入nested ::'是太诱人了。例如:

ALongNameSpaceName::LongerNamespaceName::BasicUtilityFunctionUsedVeryCommonly

这条规则背后的理由是什么?在哪些情况下我可以忽略此规则?

2 个答案:

答案 0 :(得分:5)

由于头文件被其他文件包含,因此您污染了使用您的代码的其他人的全局命名空间。你可能认为有点污染是可以的,但如果每个人都这么想,我们就会很快耗尽好名字。如果您真的无法拒绝在标头中使用命名空间指令,请将其限制在标头内。您可以通过将指令放在作用域内来实现。例如,如果您有自己的命名空间块,其主体完全限制在您的头文件中,那么您可以在其中放置using指令而不会污染全局命名空间。

namespace your_namespace
{
    // this directive is restricted to this namespace block
    using namespace ALongNameSpaceName::LongerNamespaceName;

    ...
}

您也可以在函数内部执行此操作,而不必担心它会影响其他代码。

答案 1 :(得分:2)

切勿在头文件中使用using namespace。这意味着任何导入标头的人都会将该命名空间中的所有内容都转储到其全局命名空间中(不知道他们)。这有可能导致意外的名称冲突,难以找到/调试错误,以及愤怒的程序员为你的血液。

始终在标题中使用完全限定名称。但是,在.cpp个文件中,您始终可以缩短命名空间:

namespace ALongNameSpaceName::LongerNamespaceName = ShortNamespace;

ShortNameSpace::BasicUtilityFunction