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

时间:2012-05-22 00:16:17

标签: c++ header include

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

cmath vs math.h是否相同?为什么cmath(以及许多其他类似文件)以c为前缀而不仅仅是math?它们之间是否存在更多差异?

4 个答案:

答案 0 :(得分:28)

  

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

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

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

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

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

答案 1 :(得分:4)

也许这会有所帮助:

  

C ++库包含与C语言相同的定义   库中组织了与头文件相同的结构,用   以下差异:

     

1 - 每个头文件与C具有相同的名称   语言版本,但有" c"前缀,没有扩展名。例如,   C语言头文件的C ++等价物< stdlib.h>是    < cstdlib取代。

     

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

c-prefixed vs .h extension headers

答案 2 :(得分:1)

名称以c开头的标头派生自C标准库的标头。删除了c前缀并添加了.h后缀的相应标头与C标准库标题完全相同(或几乎相同)。

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

(我刚学到它并不那么简单;请参阅Alf的回答。)

答案 3 :(得分:-1)

<cmath>和任何<cxxx>头文件都是标准的C ++,这意味着您对这些头文件所支持的内容以及其中的功能如何工作具有强烈的保证,如C ++标准所概述。他们在std命名空间中定义了一系列功能,就是这样。

尽管所有主要实现都支持

<math.h>和任何<xxx.h>标头,但它们不是标准的C ++。 但是 ,由于它们已被弃用,因此当您将它们包含在标头中时,不能保证 您的实施。实际上,在某些实现上已经观察到它们提供的功能与<cxxx>版本的行为不同。

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