全局命名空间前缀的规则和惯例?

时间:2019-03-11 08:57:52

标签: c++ namespaces std

为了防止混淆,我已经看到很多库都引用了全局命名空间(在::之前)。在某些代码库中,它似乎作为编码规则得到了很好的实施,尽管这种混乱很少发生:

namespace library_code {

namespace win32_backend {

void some_backend_internal_function() {
    ::SomeWin32GlobalFunction(...); // pretty much non-issue, different rules on naming
}

}

}

有时甚至将非库代码编写为:

int main() {
    using namespace ::boost::math::constants;

    std::cout << "pi = " << pi<double>();

    return 0;
}

但是,我几乎从未见过std命名空间像::std::max(a, b)这样的全局命名空间前缀,即使对于具有严格规则的项目也是如此。乍一看,这似乎使我感到困惑。

为什么某些项目在使用全局名称空间时会使用这种混合规则?只是std是一个受欢迎的例外吗?有什么理由和见解?

1 个答案:

答案 0 :(得分:0)

好吧,这个问题可能不仅只有一个特定的答案,而且许多人可能不同意我的答案。

  

为了防止混淆,我已经看到很多库引用了全局命名空间(前缀::)

Well名称空间旨在消除在很多地方具有相同标识符的混乱情况。标准的用法是编写任何c ++代码使用它。您可以看到boost库的实现,因为它们正确使用了名称空间。它将使您知道如何在代码中实现。

  

但是,我几乎从未见过std名称空间像:: std :: max(a,b)那样前置,即使对于具有严格规则的项目也是如此。乍一看,这似乎使我感到困惑。

好吧,我从不在代码中使用using namespace std,我强烈建议其他人也不要使用它。我已经看到很多专业人士在他们的代码中使用using namespace std。这是非常不希望的。这就像他们使用它的习惯。是的,这仅在std的情况下,因为在代码中,如果您不使用using namespace std ,您必须再次使用std::,这对许多程序员来说是不希望的。

如果使用max(),则不会知道它属于哪个名称空间,但是当使用std :: max()时,现在您知道它是标准库的一部分。

如果您将using namespace以外的其他内容用于std,则可能会遇到麻烦,并且维护代码将花费更多的精力,这是不希望的。

例如: 您已经包含许多文件,并且已经在两个名称空间stdmyNamespace中定义了max(),现在您已经使用

using namespace std;
using namespace myNamespace;

现在,当您使用max()时,由于max属于哪个命名空间,会引起混淆。