【问题标题】:Is it bad practice to use a C header instead of its C++ equivalent in C++ (e.g. stdio.h instead of cstdio)?在 C++ 中使用 C 标头而不是其 C++ 等效项(例如 stdio.h 而不是 cstdio)是不好的做法吗?
【发布时间】:2010-04-15 21:46:40
【问题描述】:

似乎很多人在他们的 C++ 代码中包含 example.h 而不是 cexample。我知道 C++ 版本中的所有内容都在命名空间 std 中声明,但我不知道任何其他差异。那么为什么人们使用 C 标头,这样做可以吗?

【问题讨论】:

    标签: c++ header-files


    【解决方案1】:

    两者的区别在于,C++ 导入的 C 头文件(以 c 为前缀,去掉 .h 后缀)位于命名空间 std。因此,为了统一起见,任何调用或使用标准设施都以std:: 为前缀。这是The Standard Way Of Doing Things(tm)。当然,除非您已经有一堆 C 代码,而您不想在每个标准调用中附加 std:::然后使用经典的 C 标头。

    【讨论】:

    • 实际上,对于我所知道的所有实现,包括 C++ 头文件,都将名称放在 std 和全局命名空间中。
    • “当然,除非你已经有一堆 C 代码,你不想在每个标准调用中附加 std::”。即使在这种情况下,C++ 也有一个解决方案:使用声明和指令。
    • 我的意思是你拿一堆C代码并用C++编译器编译它。如果这是唯一的问题,则无需更改任何内容。但在除了最简单的情况之外,您可能会比使用没有std:: 的标准c 函数得到更多的编译错误。
    【解决方案2】:

    例如stdio.hcstdio 不同。后者包括第一个,但随后取消定义了一些宏并将它们替换为实际函数。就我个人而言,我总是会使用 C++ 标头!

    【讨论】:

    • 哦,是吗?我不知道。这似乎是一个非常有说服力的理由。
    • 这是一个实现特定的东西。
    【解决方案3】:

    没关系。但是在 C++ 代码中使用 C++ 风格(即没有 .h 扩展名)似乎更整洁。我不会(也不会)担心它。

    【讨论】:

    • 我同意,这是我一直使用 C++ 风格的主要原因。
    • 我不同意。因为您仍然必须说#include "myheader.h",因此最终还是需要扩展。
    【解决方案4】:

    在使用 C++ 时,我更喜欢使用 C++ 标头语法,除非有理由不这样做。使用基于标准中以下 cmets 的 <name>(没有 .h 语法)似乎也更安全:

    第 17.4.1.2 节第 3 和第 4 段(ISO/IEC 14882,第二版 2003-10-15)指出:

    标准 C 库的功能在 18 个附加头文件中提供,如表 12 所示:

    然后它会从表格中列出,例如<cassert>, <ciso646>, ... 然后继续

    除了第 18 到 27 条的说明外,每个标题 cname 的内容应与相应的标题 name.h....

    因此,标准定义了不带.h 的标头,但确实表明,在大多数情况下,它们与 C 编译器提供的标头相同,并提供了第 18-27 条来识别差异。

    不幸的是,我无法弄清楚这些部分在标准中的什么位置,以便能够记录它们是否有用时的差异。

    我不认为在使用 C++ 编译器时需要存在 .h 标头。

    正如@James 在评论中指出的那样,第 D.5 节第 1 和第 2 段规定必须存在 C 标头:

    ...C++ 标准库提供了 18 个 C headers....

    每个 C 头文件,每个头文件都有一个 name.h 形式的名称,其行为就好像每个由相应 cname 头文件放置在标准库命名空间中的名称都是也放置在命名空间std 的命名空间范围内,后面是显式的using-declaration (7.3.3)

    【讨论】:

    • 好吧,你显然“知道区别”,它是什么?
    • @Neil 在我看来,他的意思是如果你使用 C++,你应该使用 C++ 版本的东西,除非你有理由不这样做。不过,很高兴知道其中的区别。
    • @Jonathan - 是的,这就是我想我所说的,尽管我承认我对这个话题感到沮丧(尤其是 C++ 标头 iostreamiostream.h 和程序员不知道这一点只有前者是由甚至不是最新版本的标准等定义的。对不起,如果我太以意见为导向。
    • 我无法想象 .h 标头不是必需的,因为删除它会破坏与旧 C 代码的兼容性。
    • C++ 标准库实现需要包含 C 标准库头文件(name.h 头文件)。该要求在 C++ 标准的 D.5/1 中。
    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 2015-03-29
    • 2011-11-27
    • 2011-02-10
    • 1970-01-01
    • 2015-06-20
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多