考虑以下小程序:
#include <cstdio>
int main() {
printf("%d\n", 1);
std::printf("%d\n", 2);
return 0;
}
std
命名空间中的原因是什么,因为它们默认导入全局命名空间?答案 0 :(得分:3)
关于你的第一个问题:TTBOMK,不合格的printf
在包含<cstdio>
时不应该在标准C ++中工作。
关于第二个问题:首先,C ++标准库使用了大量的标识符,包括list
,sort
,iterator
等有用和常见的标识符。 。如果它们都在全局命名空间中,我们就会被有效地删除数百个有用的名字。
此外,如果您使用显式std::
前缀几周,您可能会发现更容易阅读代码,因为它非常有效地告诉您哪些标识符来自标准库(所以你知道它们马上)。
答案 1 :(得分:3)
7.4.1.2/4:
除第18至27条所述外,每个标题
cname
的内容应与ISO / IEC 9899:1990编程语言C中规定的相应标题name.h
的内容相同。 (第7条),或ISO / IEC:1990编程语言-C修正案1:C完整性,(第7条),酌情包括在内。但是,在C ++标准库中,声明和定义(在C中定义为宏的名称除外)都在命名空间std
的命名空间范围(3.3.5)内。
D.5 / 2:
每个C标头(每个标头都具有
name.h
形式的名称,就好像每个名称放置在标准库名称空间中的相应cname
标头一样,也被置于名称空间范围内命名空间std后跟一个显式的using-declaration(7.3.3)。
但实际上,name.h
包括全局命名空间中的名称和全局和cname
命名空间中的std
(即标准指定的其他方式)。< / p>
答案 2 :(得分:1)
我个人喜欢名称空间,特别是短名称空间。
人们通常认为,既然你有一个命名空间来输入它就会更长,但这是错误的。键入命名空间的好处之一是您的编辑器可以更有效地使用自动完成功能;)
除了输入(因为有人可能会说你输入的速度比自动完成更快),还有一个净优势,如果我输入'std :: re',我会收到所有以're'开头的标识符'在std命名空间中,省去了记忆每一个的麻烦,然后我也可以直接查看他们的参数,以防我不记得确切的顺序,常量等等......
从技术上讲,还有一些关于名字冲突的事情......但是谁在乎呢?)?
答案 3 :(得分:1)
<stdio.h>
是将函数从<cstdio>
导入全局命名空间的标头。