为了防止混淆,我已经看到很多库都引用了全局命名空间(在::
之前)。在某些代码库中,它似乎作为编码规则得到了很好的实施,尽管这种混乱很少发生:
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
是一个受欢迎的例外吗?有什么理由和见解?
答案 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
,则可能会遇到麻烦,并且维护代码将花费更多的精力,这是不希望的。
例如:
您已经包含许多文件,并且已经在两个名称空间std
和myNamespace
中定义了max(),现在您已经使用
using namespace std;
using namespace myNamespace;
现在,当您使用max()
时,由于max属于哪个命名空间,会引起混淆。