cmath vs math.h(以及类似的 c 前缀与 .h 扩展标头)
cmath vs math.h (And similar c-prefixed vs .h extension headers)
我已经看到了一些关于iostream
与iostream.h
之间差异的信息。从我从这些收集到的信息来看,它们之间的区别在于,没有.h
扩展的版本不会填充命名空间,而带有扩展的版本会填充命名空间。
cmath
与math.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
。
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- C++编译器如何扩展前缀和后缀运算符++()?
- cmath vs math.h(以及类似的 c 前缀与 .h 扩展标头)
- 正则表达式替换文件扩展名前缀放置不起作用 - 替换匹配项