在C++中,是否使用C头文件的替代品(如使用stdio.h而不是cstdio)是不好的实践吗?

3

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

4个回答

4
两者之间的区别在于,C++导入的C头文件(通过添加c前缀并去除.h后缀)位于std命名空间中。这样,任何标准库的调用或使用都需要加上std::前缀,以保持统一性。这是标准做法。当然,如果您已经有一堆C代码,不想为每个标准调用添加std::前缀,则可以使用经典的C头文件。

1
实际上,根据我所了解的所有实现,包括C++头文件,都会将名称放置在std命名空间和全局命名空间中。 - anon
3
当然,除非您已经拥有一堆C语言代码,并且不想在每个标准函数调用前添加std::,否则C++有一个解决方案:使用声明和指令。 - Johannes Schaub - litb
我的意思是,你拿一堆C代码,用C++编译器编译它。如果这是唯一的问题,那么就不需要改变任何东西。但在除了最简单的情况之外,你可能会得到比使用没有std::的标准C函数更多的编译错误。 - wilhelmtell

2
例如,stdio.hcstdio不是同一个东西。后者包含前者,但是取消了一些宏定义并将其替换为真正的函数。个人建议始终使用C++头文件!

哦,真的吗?我不知道。这似乎是一个非常有说服力的理由。 - Maulrus
7
那是具体实现的问题。 - anon

1

没问题。但在C++代码中使用C++风格(即不使用.h扩展名)似乎更整洁。我不会(也不会)担心这个问题。


我同意,这也是我一直使用C++风格的主要原因。 - Maulrus
我不同意。因为你仍然需要说 #include "myheader.h",因此最终仍然需要扩展名。 - vallentin

1

在使用C++时,我更喜欢使用C++头文件语法,除非有理由不这样做。根据标准中以下评论,使用<name>(没有.h语法)似乎更安全:

第二版2003-10-15的ISO/IEC 14882中,第17.4.1.2节第3和第4段陈述:

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

然后列出了表格,例如<cassert><ciso646>等,然后继续说:

除第18至27条款中所述外,每个头文件的内容应与相应的头文件name.h的内容相同....

因此,标准定义了没有.h的头文件,但指出它们在很大程度上与C编译器提供的头文件相同,并提供第18至27条款以确定差异。

很遗憾,我无法确定这些部分在标准中的位置,以便在必要时记录差异。

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

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

... C++标准库提供了18个C 头文件....

每个C头文件,其名称形式为name.h,就好像由相应的头文件将每个名称放置在标准库命名空间中一样,也被放置在命名空间std的命名空间范围内,并跟随一个显式的using-declaration(7.3.3)


2
好的,既然你显然“知道区别”,那是什么? - anon
@Neil,我觉得他的意思是说,如果你在使用C++,那么应该使用C++版本的东西,除非你有理由不这样做。不过,了解差异还是很重要的。 - Jonathan M Davis
@Jonathan - 是的,这就是我所说的,尽管我承认在这个话题上我感到有些沮丧(特别是关于C++头文件iostream与iostream.h的区别,以及程序员不知道只有前者被最新版本的标准定义等)。如果我的观点过于主观,那么请原谅。 - Kaleb Pederson
我无法想象不需要 .h 头文件,因为删除它会破坏与传统 C 代码的兼容性。 - Maulrus
C++标准库实现必须包含C标准库头文件(name.h头文件)。该要求在C++标准的D.5/1中规定。 - James McNellis
@Neil - 回顾我的原始陈述,它的语气非常糟糕,绝对没有表达我想要表达的意思。你很克制,没有给我点踩。我道歉了。 - Kaleb Pederson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接