提问人:rustyhu 提问时间:12/16/2021 最后编辑:songyuanyaorustyhu 更新时间:12/17/2021 访问量:1055
什么是 C++ 中的“使用命名空间::std”
What is "using namespace::std" in C++
问:
我正在阅读其他人的一些代码片段,我发现一行:
using namespace::std;
我怀疑它的目的是,有一些错别字。但令我惊讶的是,编译器毫无怨言地接受了这段代码。我使用以下方法构建:using namespace std;
$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
$ /usr/bin/g++ ${SRC} -std=c++11 -pthread -Wall -Wno-deprecated -o ${OUT}
我想知道为什么这个代码是有效的,它会产生什么影响?我怀疑这是一种不好的做法。
答:
7赞
songyuanyao
12/16/2021
#1
它等效于,也等于 。它指的是全局命名空间,并且确实被放在全局命名空间中。using namespace ::std;
using namespace std;
::
std
作为 using 指令的语法:
(强调我的)
attr(optional) using namespace nested-name-specifier(optional) namespace-name ;
... ...
nested-name-specifier - 名称和范围解析的序列 运算符 ::,以作用域解析运算符结尾。一个 :: 引用全局命名空间。
......
评论
2赞
Peter
12/16/2021
在另一个命名空间中,该命名空间又包含一个名为 的命名空间,并且会产生不同的效果。std
using namespace std
using namespace ::std
3赞
Gonen I
12/16/2021
#2
using namespace::std
与using namespace std;
符号是作用域解析运算符。当在它前面没有作用域名称时,它指的是全局命名空间。这意味着这是一个顶级命名空间,而不是包含在另一个命名空间中。::
std
在这种情况下,前面和后面的空格是可选的,因为词法分析器可以从上下文中推断出标记。::
例如,以下所有项均有效:
namespace A { namespace notstd{} } // define my own namespaces A and A::notstd
using namespace::std; // the standard library std
using namespace A;
using namespace ::A;
using namespace::A;
using namespace A::notstd;
更新:
正如其中一条注释中所指出的,如果语句位于另一个包含其自己的嵌套命名空间的命名空间中,实际上可能会导致不同的结果。请参阅以下(极不可能)示例:using namespace ::std;
using namespace std;
std
#include <stdio.h>
namespace A {
namespace std {
int cout = 5;
}
using namespace std;
void f1() {
cout++;
}
}
int main()
{
A::f1();
printf("%d\n",A::std::cout); // prints 6
return 0;
}
评论
::
::std
std
namespace
::
::