C++中的"using namespace::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}
请问这段代码为什么有效,会产生什么影响?我怀疑这是一种不好的做法。
相当于using namespace ::std;
,也相当于using namespace std;
。 ::
指的是全局命名空间,std
确实放在全局命名空间中。
作为using-directives的语法:
(强调我的)
attr(optional) using namespace nested-name-specifier(optional) namespace-name ;
... ...
nested-name-specifier - a sequence of names and scope resolution
operators ::, ending with a scope resolution operator. A single ::
refers to the global namespace.
... ...
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;
更新:
如其中一条评论所述,如果语句位于另一个包含其自己的嵌套命名空间 std
的命名空间中,using namespace ::std;
和 using namespace 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;
}
我正在阅读其他人的一些代码片段并找到一行:
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}
请问这段代码为什么有效,会产生什么影响?我怀疑这是一种不好的做法。
相当于using namespace ::std;
,也相当于using namespace std;
。 ::
指的是全局命名空间,std
确实放在全局命名空间中。
作为using-directives的语法:
(强调我的)
attr(optional) using namespace nested-name-specifier(optional) namespace-name ;
... ...
nested-name-specifier - a sequence of names and scope resolution operators ::, ending with a scope resolution operator. A single :: refers to the global namespace.
... ...
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;
更新:
如其中一条评论所述,如果语句位于另一个包含其自己的嵌套命名空间 std
的命名空间中,using namespace ::std;
和 using namespace 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;
}