C++ stdio.h在C+中不是标准的+;?

C++ stdio.h在C+中不是标准的+;?,c++,stdio,standard-library,C++,Stdio,Standard Library,我知道大多数编译器都允许这两种情况: #include <stdio.h> #包括 及 #包括 但是有人认为实际上不是C++标准。这是真的吗?stdio.h是标准的,但不推荐使用。在C++中,总是喜欢 CSTDIO < /C> > > < /P> [n3290:C.3.1/1]:与标准C库的兼容性, C++标准库提供18个C标题(D.5),但它们的用法是 在C++中被禁止。< /强> [n3290:D.5/3]:[示例:标题 在命名空间std中提供其声明和定义 也可以在全局命

我知道大多数编译器都允许这两种情况:

#include <stdio.h>
#包括

#包括

<>但是有人认为<代码>实际上不是C++标准。这是真的吗?

stdio.h
是标准的,但不推荐使用。在C++中,总是喜欢<代码> CSTDIO < /C> > > < /P>
[n3290:C.3.1/1]:
与标准C库的兼容性, C++标准库提供18个C标题(D.5),但它们的用法是 在C++中被禁止。< /强>

[n3290:D.5/3]:
[示例:标题
在命名空间
std
中提供其声明和定义 也可以在全局命名空间中提供这些名称。标题
肯定提供了相同的声明和定义 在全局命名空间中,就像在C标准中一样 在命名空间中提供这些名称
std
-结束示例]


C++标准库明确包含C标准库,所以C++是完全合法的部分。如果你在C++代码中使用<代码>包含< /COD>,那么你不应该这样做,因为C++语法中,C代码应该使用CSTDIO

< P>这是不正确的,因为C++的主要目标是与C的向后兼容。唯一的区别是对于

#include <cstdio>
#包括

所有函数均在 STD< /COD>命名空间

< P> C标准头包含在C++标准库中以兼容。p>

差异在于,相应的C++头中的标识符必须(也)在STD命名空间中,而C头中的标识符也必须在全局命名空间中可用。 此外,

标题为诸如
abs
pow
等函数添加重载


也可以用C++的头替换一些具有重载功能的C分类/比较宏。代码> STDIO。H/COD>可以把东西放在 STD中,并且使用它是不可否认的。只要C++与C兼容,它就合法:D.但是被弃用。当然C++不是100%兼容C,它不是“C语法”,除了<代码> >包含< /C> >。我知道,但是在C代码中看到某人使用<代码>包含< /代码>并不常见,那是因为< C. >中没有代码> CSTDIO < /C>。我想你可能误解了“语法”这个词的意思。1“你不应该那样做”的建议是不好的。cstdio不能保证一个干净的全局名称空间,所以它的唯一效果是您必须编写更多的限定条件或使用语句或其他任何东西来获得可移植的代码。也就是说,它是一个愚蠢的工作,这是愚蠢的。(建议)是不好的。@ alfp.斯坦巴赫我从未说过他应该使用CSTDIO,但是如果他在C++代码中使用STDIO。H或CSTDIO,他应该使用CSTDIO -1。C++中总是建议“Case> CSTDIO < /Cord>”是不好的。code>cstdio不能保证干净的全局名称空间,因此它的唯一效果是您必须编写更多限定条件或使用语句或其他任何东西才能获得可移植的代码。也就是说,更多的工作是为了获得负收益,这是尽可能愚蠢的=>建议是不好的。@Alf:那么你会推荐不推荐的标题吗?这似乎很愚蠢。而

使用
/限定符是一件好事。在国际标准中,“弃用”一词的意思是“可以在标准的更高版本中删除”。然而,C头不会消失。它们在C++98中被乐观地弃用,但AFAIK没有实现C++98所要求的干净分离,这无疑是C++11现在允许头污染名称空间的原因。您的技术和历史分析是准确的。但是标题仍然不推荐使用,我看不出有什么理由喜欢它们。如果我在C++代码审查中看到C标题,代码就不会通过。只要C和C++编译器共同生存(大多数编译器都有C和C++模式),并且使用相同的系统包括目录,C标题将在那里,即使它们被从标准中删除。我引用了标准一刻钟前的一段话。-1“此外”是错误的:C++11§D.5/2“每个C头,都有一个
name.h
格式的名称,其行为就好像由相应的cname头放在标准库名称空间中的每个名称都放在全局名称空间范围内。”@干杯。-阿尔夫:客人说得对。
abs
和类似函数的不同输入类型的重载在
中有定义,但在
中没有定义(根本不包括
abs
;它在
中,只取int)。@Kundor:在C++11§D.5/2中,你不理解的第一个单词是什么“每个C头,每个C头都有一个表单名.h的名称,其行为就好像由相应的cname头放置在标准库命名空间中的每个名称都被放置在全局命名空间范围内。”?@Cheersandhth.-Alf:嗯,我的编译器也不明白,因为访问者和我说的就是发生的事情。试试看。
#include <cstdio>