C++ - cmath vs math.h(以及类似的c-prefixed vs .h扩展头)

gol*_*enk 56 c++ header include

我已经看到了一些关于iostreamvs 之间差异的信息iostream.h.根据我从中收集的内容,它们之间的区别在于,没有.h扩展名的版本将不会填充命名空间,而具有扩展名的版本将填充.

对于cmathvs,这是一样的math.h吗?为什么cmath(以及许多其他类似的文件)以a c为前缀而不仅仅是math?他们之间有更多的差异吗?

感谢您的时间!

Che*_*Alf 30

我已经看到了一些关于iostream和iostream.h之间差异的信息.

[iostream.h]不是标准标题.

这不是你提出的问题的一个例子.

[cmath]在std名称空间中定义符号,也可以在全局名称空间中定义符号.[math.h]在全局命名空间中定义符号,也可以在std命名空间中定义符号.如果包含前者并使用非限定符号,则可以使用一个编译器进行编译,但不能使用另一个编译器进行编译.因此使用[math.h]是个好主意.通常,对于这样的标题对,使用[.h]版本.

c ++ 98提供了c xxx头的正式保证,不会污染全局命名空间.也许这就是他们被定义的原因.然而,这比实施污染更难实现,所以在实践中我没有标准的库实现遵循这方面的标准,因此它最终改为反映c ++ 11中的现实.

  • @Jesse:论证如果你包含`math.h`,那么你*知道*你在全局命名空间中丢弃了一堆垃圾.如果你包含`cmath`,那么你*可能会或者可能不会在你的全局命名空间中丢弃一堆垃圾.相反,你不关心你是否在命名空间`std`中丢弃一堆垃圾,因为你从不在那里自己定义符号.因此,无论委员会对此有什么看法,"math.h"所做的事情的不确定性在某种意义上要比"cmath"所做的不确定性更好. (14认同)
  • `因此使用[math.h]是个好主意.一般来说,对于这样的标题对,要使用[.h]版本.我不同意..h版本存在的唯一原因是兼容性.由于某种原因,C标题列在[**depr**.c.headers]下. (10认同)
  • 非常糟糕的建议,从 C++11 开始,`<math.h>` 在 C++ 标准中已被弃用,这意味着编译器仅支持它以实现向后兼容性。这意味着您无法保证每个实现在“xh”标头中放入的内容,因为它们不是标准的。事实上,在某些情况下已经观察到,在某些实现上,“xh”版本有时与“cx”版本具有不同的内容,其中重载的行为不同,这可能令人惊讶。因此,如果您正在编写 C++,请始终使用“<cx>”标头。 (4认同)
  • 最终,该标准明确规定了您*允许*写的内容,并且还考虑了*明智*写的内容。没有规则可以说委员会总是明智的,即使通常是这样,而且从根本上说,这些标题是不同类型坏事之间的混乱妥协。我个人使用 `cmath` 并希望不要写出我的实现没有发现的错误(这是 C++03 中的一致性失败和 C++11 中的 QoI 问题),但其他人有不同的优先级。 (2认同)
  • 5年后我坐在这里想知道我是否应该在我的C++(11)程序中使用`cmath`或`math.h`header.哪一个?从这个答案和一些评论的流行,我认为我应该使用`math.h`? (2认同)

小智 5

也许这会有所帮助:

C++库包含与C语言库相同的头文件结构组织的相同定义,区别如下:

1 - 每个头文件的名称与 C 语言版本相同,但带有“c”前缀且没有扩展名。例如,C 语言头文件 <stdlib.h> 的 C++ 等效项是 <cstdlib>。

2 - 库的每个元素都在 std 命名空间中定义。

c 前缀 vs .h 扩展标头