C++ 全局命名空间前缀的规则和实践?
我见过很多库引用全局名称空间(前面加了C++ 全局命名空间前缀的规则和实践?,c++,namespaces,std,C++,Namespaces,Std,我见过很多库引用全局名称空间(前面加了:)以防止混淆。在某些代码库中,它似乎作为一种编码规则得到了很好的实施,尽管这种混淆很少发生: 名称空间库\u代码{ 名称空间win32_后端{ 无效某些\u后端\u内部\u函数(){ ::SomeWin32GlobalFunction(…);//几乎没有问题,命名规则不同 } } } 有时甚至非库代码也是这样编写的: intmain(){ 使用namespace::boost::math::constants; std::cout好吧,这个问题可能不止一
:
)以防止混淆。在某些代码库中,它似乎作为一种编码规则得到了很好的实施,尽管这种混淆很少发生:
名称空间库\u代码{
名称空间win32_后端{
无效某些\u后端\u内部\u函数(){
::SomeWin32GlobalFunction(…);//几乎没有问题,命名规则不同
}
}
}
有时甚至非库代码也是这样编写的:
intmain(){
使用namespace::boost::math::constants;
std::cout好吧,这个问题可能不止一个答案,很多人可能不同意我的答案
我见过很多库引用全局名称空间(前缀::),以防止混淆
命名空间的设计是为了在很多地方都有相同的标识符来消除混淆。使用C++编写任何C++代码是标准的。在使用正确的命名空间时,你可以看到Boost库的实现。它会告诉你如何在代码中实现。
然而,我几乎从未见过std名称空间像::std::max(a,b)那样被预先加上前缀,即使对于这样有严格规则的项目也是如此
我从不在我的代码中使用使用名称空间std
,我强烈建议其他人也不要使用它。我见过许多专业人士在他们的代码中使用使用名称空间std
。这是非常不受欢迎的。这就像他们使用它的习惯。是的,这只是在std的情况下,因为在代码中,如果你不使用使用命名空间标准
,您必须一次又一次地使用std::
,这对许多程序员来说是不可取的
如果您使用max(),您将不知道它属于哪个名称空间,但当您使用std::max()时,现在您知道它是标准库的一部分
如果对std
以外的内容使用使用名称空间
,则之后可能会遇到一些问题,维护代码将花费更多的精力,这是不可取的
例如:
您已经包含了许多文件,并且在两个名称空间std
和myNamespace
中定义了max(),现在您已经使用了
using namespace std;
using namespace myNamespace;
现在,当您使用max()
时,会出现混淆,因为max属于哪个名称空间。好吧,这个问题可能不只一个特定的答案,许多人可能不同意我的答案
我见过很多库引用全局名称空间(前缀::),以防止混淆
命名空间的设计是为了在很多地方都有相同的标识符来消除混淆。使用C++编写任何C++代码是标准的。在使用正确的命名空间时,你可以看到Boost库的实现。它会告诉你如何在代码中实现。
然而,我几乎从未见过std名称空间像::std::max(a,b)那样被预先加上前缀,即使对于这样有严格规则的项目也是如此
我从不在我的代码中使用使用名称空间std
,我强烈建议其他人也不要使用它。我见过许多专业人士在他们的代码中使用使用名称空间std
。这是非常不受欢迎的。这就像他们使用它的习惯。是的,这只是在std的情况下,因为在代码中,如果你不使用使用命名空间标准
,您必须一次又一次地使用std::
,这对许多程序员来说是不可取的
如果您使用max(),您将不知道它属于哪个名称空间,但当您使用std::max()时,现在您知道它是标准库的一部分
如果对std
以外的内容使用使用名称空间
,则之后可能会遇到一些问题,维护代码将花费更多的精力,这是不可取的
例如:
您已经包含了许多文件,并且在两个名称空间std
和myNamespace
中定义了max(),现在您已经使用了
using namespace std;
using namespace myNamespace;
现在当您使用max()
时,会出现混淆,因为max属于哪个名称空间。好吧,对不起,我应该更加小心措辞。我要问的不是std
名称空间为什么是显式的;而是全局名称空间前缀(:
)在几乎所有项目中都省略了std
之前。就我个人而言,我从未使用过全局名称空间前缀(:),但这些答案并不能解释不一致性。所有这些原因(例如,难以阅读、不必要的混乱、仅用于消除歧义)也可以很容易地应用于非std
代码。这样做只是为了消除歧义。我有一段代码,这是必要的,因为我在一个名称空间X
,它有一个标准偏差函数–std
。每当我想访问std
名称空间时,我需要使用::std
be否则编译器会认为我引用的是上述函数。具体示例:名称空间X{double std(::std::vector const&values){…}void foo(::std::vector const&values){::std::我应该在措辞上更加小心,对不起。我问的不是为什么std
名称空间是显式的;而是在std
几乎在所有项目中被省略之前的全局名称空间前缀(::
)但这些答案并不能解释矛盾。所有这些原因(例如,难以阅读,不必要的混乱,仅用于消除歧义)也可以很容易地应用于非std
代码。这样做只是为了消除歧义。我有一段代码,这是必要的,因为我在命名空间X
中,它有一个标准偏差函数–std
。每当我想访问