cmath vs math.h(以及类似的 c 前缀与 .h 扩展标头)

cmath vs math.h (And similar c-prefixed vs .h extension headers)

本文关键字:前缀 扩展 math vs cmath      更新时间:2023-10-16

我已经看到了一些关于iostreamiostream.h之间差异的信息。从我从这些收集到的信息来看,它们之间的区别在于,没有.h扩展的版本不会填充命名空间,而带有扩展的版本会填充命名空间。

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

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

[iostream.h] 不是标准标头。

这不是您提出的问题的一个例子。

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

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

也许这会有所帮助:

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

1 - 每个头文件与 C 同名语言版本,但带有"C"前缀且没有扩展名。例如 C 语言头文件的C++等效项是

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

C 前缀与 .h 扩展标头

名称以 c 开头的标头派生自 C 标准库的标头。删除了 c 前缀并添加了.h后缀的相应标头与 C 标准库标头相同(或非常接近相同(。

<cmath> 定义 std 命名空间下的相关符号; <math.h>在全球范围内定义了它们。

(我刚刚知道事情没那么简单;看看阿尔夫的回答。

<cmath>和任何<cxxx>标头都是标准C++,这意味着您可以充分保证这些标头中支持的内容以及其中的函数如何工作,如C++标准中所述。它们在 std 命名空间中定义了一系列函数,仅此而已。

<math.h> 和任何 <xxx.h> 标头都不是标准C++,尽管每个主要实现都支持。但是,由于它们已弃用,因此当您将它们包含在实现中时,无法保证这些标头中的内容。实际上,在某些实现中已经观察到它们提供的功能与<cxxx>版本的行为不同

因此,在编写C++时应始终使用<cxxx>,并使用 std:: 限定函数的名称,例如 std::malloc