【问题标题】:stdio.h not standard in C++?stdio.h 在 C++ 中不是标准的?
【发布时间】:2011-11-27 15:01:18
【问题描述】:

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

#include <stdio.h>

#include <cstdio>

但有人认为&lt;stdio.h&gt; 实际上并不是 C++ 标准。这是真的吗?

【问题讨论】:

    标签: c++ stdio standard-library


    【解决方案1】:

    stdio.h 是标准的,但已弃用。总是更喜欢 C++ 中的cstdio

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

    [n3290: D.5/3]: [例子: 标题&lt;cstdlib&gt; 肯定 在命名空间std 中提供其声明和定义。它 也可以在全局命名空间中提供这些名称。 标题 &lt;stdlib.h&gt; 确实提供了相同的声明和定义 在全局命名空间中,就像在 C 标准中一样。它也可能 在命名空间std 中提供这些名称。 —结束示例 ]

    【讨论】:

    • -1 建议“在 C++ 中总是更喜欢 cstdio”是不好的。 cstdio 不保证一个干净的全局命名空间,所以它唯一的影响是你必须编写更多的限定或 using 语句或任何东西来获得可移植的代码。即,负收益需要更多的工作,这是尽可能愚蠢的 => 建议是不好的。
    • @Alf:所以你会推荐弃用的标题?这似乎很愚蠢。而using/qualifiers 是一件好事
    • 在国际标准中,“弃用”一词的意思是“可以在更高版本的标准中删除”。但是 C 标头不会消失。它们在 C++98 中被乐观地弃用,但 AFAIK 没有实现过 C++98 所需的干净分离,这肯定是 C++11 现在允许标头污染命名空间的原因。
    • 您的技术和历史分析是准确的。但是标题仍然被弃用,我认为没有理由更喜欢它们。如果我在 C++ 代码审查中看到 C 标头,则代码不会通过。结束。
    • 只要 C 和 C++ 编译器一起存在(大多数编译器具有 C 和 C++ 模式)并使用相同的系统包含目录,C 头文件就会在那里,即使它们已从标准中删除。
    【解决方案2】:

    这不是真的,因为 C++ 的主要目标是向后兼容 C。唯一的区别是对于

    #include <cstdio>
    

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

    【讨论】:

    • 有点简单化的观点。 stdio.h可以把东西放在std,无论如何都不推荐使用它。
    • 只要 C++ 与 C 兼容,它就是合法的 :D
    • 但已弃用。当然,C++ 也不是 100% 兼容 C。
    【解决方案3】:

    为了兼容性,C 标准头文件包含在 C++ 标准库中。

    不同之处在于相应 C++ 头文件中的标识符必须(也)在 std 命名空间中,而 C 头文件中的标识符必须(也)在全局命名空间中可用。

    此外,&lt;c...&gt; 标头为 abspow 等函数添加了重载。

    此外,C++ 头文件用重载函数替换了一些 C 分类/比较宏。

    【讨论】:

    • 你可能不知道,但他们知道。我从标准的一刻钟前引用了那段话。
    • -1 “另外”是错误的:C++11 §D.5/2 “每个 C 头文件,每个头文件都有一个 name.h 形式的名称,表现得好像每个名称由相应的 cname 标头放置在标准库命名空间中的是放置在全局命名空间范围内。”
    • @Cheersandhth.-Alf:访客是正确的。 abs 和类似函数的不同输入类型的重载在 &lt;cmath&gt; 中定义,但在 &lt;math.h&gt; 中没有定义(根本不包括 abs;它在 &lt;stdlib.h&gt; 中,并且只接受 int。)跨度>
    • @Kundor:在 C++11 §D.5/2 中你不理解的第一个单词是什么“每个 C 头文件,每个头文件都有一个名为 name.h 的名称, 表现得好像每个由相应 cname 标头放置在标准库命名空间中的名称都放置在全局命名空间范围内。"?
    • @Cheersandhth.-Alf:嗯,我的编译器也不理解它,因为访问者和我说的是发生了什么。试试看。
    【解决方案4】:

    C++ 标准库明确包含 C 标准库,因此是完全合法的 C++ 部分。如果你说的是在 C++ 代码中使用 #include &lt;stdio.h&gt;,那么你不应该这样做,因为那是 C 语法,在 C++ 代码中,你应该总是使用 cstdio

    【讨论】:

    • 它不是“C 语法”,而不是 #include &lt;cstdio&gt;
    • 我知道,但很少有人在 C 代码中使用 #include &lt;cstdio&gt;
    • 那是因为cstdio在C中不存在...我想你可能误解了“语法”这个词的意思。
    • -1 “你不应该那样做”的建议是不好的。 cstdio 不保证一个干净的全局命名空间,所以它唯一的影响是你必须编写更多的限定或使用语句或任何东西来获得可移植的代码。即,负收益需要更多的工作,这是尽可能愚蠢的 => 建议是不好的。
    • @AlfP.Steinbach 我从来没有说过他应该使用 cstdio,但如果他必须在 C++ 代码中使用 stdio.h 或 cstdio,他应该使用 cstdio
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2016-04-04
    • 2011-10-16
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多