我已经看到了一些关于iostream
vs 之类的东西之间差异的信息iostream.h
。根据我从这些收集到的信息,它们之间的区别在于,没有.h
扩展名的版本不会填充命名空间,而有扩展名的版本会。
这与cmath
vs相同math.h
吗?为什么cmath
(以及许多其他类似的文件)以 a 为前缀,c
而不仅仅是 being math
?他们之间有更多的区别吗?
我已经看到了一些关于 iostream 与 iostream.h 之类的东西之间差异的信息。
[iostream.h] 不是标准头文件。
这不是您提出的问题的示例。
[cmath] 定义std
命名空间中的符号,也可以定义全局命名空间中的符号。[math.h] 在全局命名空间中定义符号,也可以在std
命名空间中定义符号。如果您包含前者并使用非限定符号,则它可以用一个编译器编译,但不能用另一个编译器编译。因此使用 [math.h] 是个好主意。通常,对于此类标头对,使用 [.h] 版本。
c++98 提供了 cxxx
标头不污染全局命名空间的正式保证。也许这就是他们被定义的原因。然而,这比污染更难实现,所以在实践中,我所知道的没有标准库实现在这方面遵循标准,所以它最终被改变以反映 c++11 中的现实。
也许这会有所帮助:
C++ 库包含与以相同头文件结构组织的 C 语言库相同的定义,但有以下区别:
1 - 每个头文件与 C 语言版本具有相同的名称,但带有“c”前缀且没有扩展名。例如,C 语言头文件 <stdlib.h> 的 C++ 等效项是 <cstdlib>。
2 - 库的每个元素都在 std 命名空间中定义。
名称以开头c
的头文件派生自 C 标准库的头文件。c
删除前缀并添加后缀的相应头文件与.h
C 标准库头文件相同(或几乎相同)。
<cmath>
定义命名空间下的相关符号std
;<math.h>
全局定义它们。
(我刚刚了解到这并不那么简单;请参阅 Alf 的回答。)
<cmath>
并且任何<cxxx>
标头都是标准 C++,这意味着您可以有力地保证这些标头中支持的内容以及其中的函数如何工作,如 C++ 标准中所述。它们在命名空间中定义了一系列函数,std
仅此而已。
<math.h>
并且任何<xxx.h>
头文件都不是标准的 C++,尽管每个主要实现都支持。但是,由于它们已被弃用,因此当您将它们包含在您的实现中时,无法保证这些标头中的内容。事实上,在某些实现中已经观察到它们提供的功能与版本不同<cxxx>
。
因此,在编写 C++ 时应始终使用<cxxx>
,并用 来限定函数的名称std::
,例如std::malloc
.