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

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

cmathmath.h的情况是一样的吗?为什么 cmath(和许多其他类似的文件)的前缀是 c,而不仅仅是 math?他们之间还有什么不同吗?

74476 次浏览

名称以 c开头的标头来源于 C 标准库的标头。删除了 c前缀和添加了 .h后缀的对应头与 C 标准库头是相同的(或者非常相似)。

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

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

我看到了一些关于 iostream 和 iostream 之间差异的信息。

[iostream.h] is not a standard header.

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

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

C + + 98正式保证 cxxx头不会污染全局名称空间。也许这就是他们被定义的原因。然而,这个实现起来比那些造成污染的要难一些,所以在实践中,据我所知没有标准库实现遵循这方面的标准,所以它最终被修改以反映 c + + 11中的现实。

也许这个会有帮助:

The C++ library includes the same definitions as the C language 组织在头文件的相同结构中的 以下差异:

1-每个头文件都有与 C 相同的名称 language version but with a "c" prefix and no extension. For example, C 语言头文件 < stdlib.h > 的 C + + 等价物是 < cstdlib > .

2 - Every element of the library is defined within the std namespace.

C-前缀 vs. h 扩展头

<cmath> and any <cxxx> header are standard C++, meaning you have strong guarantees of what is supported in those headers and how the functions in them work, as outlined in the C++ Standard. They define a series of functions in the std namespace, and that's it.

<math.h>和任何 <xxx.h>报头都是 没有标准 C + + ,尽管每个主要实现都支持它们。然而,因为它们已经被废弃了,所以当你在你的实现中包含它们的时候,有 保证那些头里面有什么。事实上,在某些实现中已经观察到,它们提供的函数在 <cxxx>版本中表现为 不一样

Therefore, you should always use <cxxx> when writing C++, and qualify the names of the functions with std::, for example std::malloc.