【发布时间】:2010-04-15 21:46:40
【问题描述】:
似乎很多人在他们的 C++ 代码中包含 example.h 而不是 cexample。我知道 C++ 版本中的所有内容都在命名空间 std 中声明,但我不知道任何其他差异。那么为什么人们使用 C 标头,这样做可以吗?
【问题讨论】:
标签: c++ header-files
似乎很多人在他们的 C++ 代码中包含 example.h 而不是 cexample。我知道 C++ 版本中的所有内容都在命名空间 std 中声明,但我不知道任何其他差异。那么为什么人们使用 C 标头,这样做可以吗?
【问题讨论】:
标签: c++ header-files
两者的区别在于,C++ 导入的 C 头文件(以 c 为前缀,去掉 .h 后缀)位于命名空间 std。因此,为了统一起见,任何调用或使用标准设施都以std:: 为前缀。这是The Standard Way Of Doing Things(tm)。当然,除非您已经有一堆 C 代码,而您不想在每个标准调用中附加 std:::然后使用经典的 C 标头。
【讨论】:
std:: 的标准c 函数得到更多的编译错误。
例如stdio.h 与cstdio 不同。后者包括第一个,但随后取消定义了一些宏并将它们替换为实际函数。就我个人而言,我总是会使用 C++ 标头!
【讨论】:
没关系。但是在 C++ 代码中使用 C++ 风格(即没有 .h 扩展名)似乎更整洁。我不会(也不会)担心它。
【讨论】:
#include "myheader.h",因此最终还是需要扩展。
在使用 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)
【讨论】:
iostream 与 iostream.h 和程序员不知道这一点只有前者是由甚至不是最新版本的标准等定义的。对不起,如果我太以意见为导向。
name.h 头文件)。该要求在 C++ 标准的 D.5/1 中。