【发布时间】:2011-11-27 15:01:18
【问题描述】:
我知道大多数编译器都允许:
#include <stdio.h>
和
#include <cstdio>
但有人认为<stdio.h> 实际上并不是 C++ 标准。这是真的吗?
【问题讨论】:
标签: c++ stdio standard-library
我知道大多数编译器都允许:
#include <stdio.h>
和
#include <cstdio>
但有人认为<stdio.h> 实际上并不是 C++ 标准。这是真的吗?
【问题讨论】:
标签: c++ stdio standard-library
stdio.h 是标准的,但已弃用。总是更喜欢 C++ 中的cstdio。
[n3290: C.3.1/1]:为了与标准 C 库兼容, C++ 标准库提供了 18 个 C 头文件 (D.5),但它们的用途是 在 C++ 中已弃用。
[n3290: D.5/3]:[例子: 标题<cstdlib>肯定 在命名空间std中提供其声明和定义。它 也可以在全局命名空间中提供这些名称。 标题<stdlib.h>确实提供了相同的声明和定义 在全局命名空间中,就像在 C 标准中一样。它也可能 在命名空间std中提供这些名称。 —结束示例 ]
【讨论】:
cstdio”是不好的。 cstdio 不保证一个干净的全局命名空间,所以它唯一的影响是你必须编写更多的限定或 using 语句或任何东西来获得可移植的代码。即,负收益需要更多的工作,这是尽可能愚蠢的 => 建议是不好的。
using/qualifiers 是一件好事。
这不是真的,因为 C++ 的主要目标是向后兼容 C。唯一的区别是对于
#include <cstdio>
所有函数都在std命名空间中
【讨论】:
stdio.h可以把东西放在std,无论如何都不推荐使用它。
为了兼容性,C 标准头文件包含在 C++ 标准库中。
不同之处在于相应 C++ 头文件中的标识符必须(也)在 std 命名空间中,而 C 头文件中的标识符必须(也)在全局命名空间中可用。
此外,<c...> 标头为 abs、pow 等函数添加了重载。
此外,C++ 头文件用重载函数替换了一些 C 分类/比较宏。
【讨论】:
name.h 形式的名称,表现得好像每个名称由相应的 cname 标头放置在标准库命名空间中的是放置在全局命名空间范围内。”
abs 和类似函数的不同输入类型的重载在 <cmath> 中定义,但在 <math.h> 中没有定义(根本不包括 abs;它在 <stdlib.h> 中,并且只接受 int。)跨度>
C++ 标准库明确包含 C 标准库,因此是完全合法的 C++ 部分。如果你说的是在 C++ 代码中使用 #include <stdio.h>,那么你不应该这样做,因为那是 C 语法,在 C++ 代码中,你应该总是使用 cstdio
【讨论】:
#include <cstdio>。
#include <cstdio>
cstdio在C中不存在...我想你可能误解了“语法”这个词的意思。