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

vla*_*nel 15 c++ stdio standard-library

我知道大多数编译器都允许:

#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

//和

#include <cstdio>
Run Code Online (Sandbox Code Playgroud)

但有人认为<stdio.h>实际上并不是C++标准.

真的吗?

Lig*_*ica 28

stdio.h是标准的,但已弃用.总是喜欢cstdioC++.

[n3290: C.3.1/1]:为了与标准C库兼容,C++标准库提供了18个C标头(D.5),但它们的使用在C++中已弃用.

[n3290: D.5/3]:[ 示例:标头<cstdlib>确实在命名空间中提供其声明和定义std.它还可以在全局命名空间中提供这些名称.标题 <stdlib.h>肯定在全局命名空间中提供相同的声明和定义,就像在C标准中一样.它还可以在命名空间中提供这些名称std. - 末端的例子 ]

  • -1"在C++中总是更喜欢`cstdio`"的建议是不合适的.`cstdio`不保证一个干净的全局命名空间,因此它的唯一作用是你必须编写更多的资格或使用语句或任何东西来获取可移植的代码.也就是说,负面收益更多的工作,尽可能愚蠢=>建议是不好的. (6认同)
  • @Alf:所以你推荐不推荐的标题?这看起来很傻.并且`using`/qualifiers是一件好事_. (6认同)
  • 您的技术和历史分析是准确的.但标题仍然被弃用,我认为没有理由更喜欢它们.如果我在C++代码审查中看到C头文件,代码就不会通过.结束. (6认同)
  • 只要C和C++编译器在一起(大多数编译器都有C和C++模式)并使用相同的系统包含目录,C头就会存在,即使它们已从标准中删除. (3认同)
  • 在国际标准中,"弃用"一词的意思是"可以在标准的更新版本中删除".但是C标题不会消失.他们在C++ 98中被乐观地弃用了,但AFAIK没有实现过C++ 98所要求的清晰分离,这无疑是C++ 11现在允许标题污染命名空间的原因. (2认同)

Gre*_*ape 7

事实并非如此,因为C++的主要目标是向后兼容C.唯一的区别在于

#include <cstdio>
Run Code Online (Sandbox Code Playgroud)

所有函数都在std命名空间中

  • 但弃用了.当然,C++与C不是100%兼容. (3认同)