<math.h>是C还是C++?

is <math.h> for C or C++?

本文关键字:还是 C++ gt lt math      更新时间:2023-10-16

我需要自然对数函数才能在.cpp(c ++)源文件中使用。现在,当然,我可以通过快速的谷歌搜索和简单的库解决方案来做到这一点。但我有点困惑...

在 cplusplus dot com 网站的 reference/cmath/log/下,他们有一个如何使用日志函数的示例,如下所示:

/* log example */
#include <stdio.h>      /* printf */
#include <math.h>       /* log */
int main ()
{
double param, result;
param = 5.5;
result = log (param);
printf ("log(%f) = %fn", param, result );
return 0;
}

我有一些问题:

1)他们为什么使用

<stdio.h>

我以为这是给C的,而不是真的给C++的?

2)他们为什么使用

<math.h>

我虽然 .h 代表 C 头文件而不是 .hpp C++头文件?

忘记了stdio的使用(无论如何我都会使用iostream),但即使如此,通过使用

<math.h>

感觉就像我在写 C 代码而不是C++代码。我通过授课课程学习C++,讲师在第一周涵盖了 C,然后说我们不会再使用 C,但从现在开始将使用 C++。我觉得如果老师问"你为什么使用 C 头文件?你应该在C++工作"。

任何解释都非常感谢。

<math.h>是 C 标准中指定的标头。 它的用法在C++中得到支持,但被所有C++标准正式弃用(这意味着大约计划从未来的标准中删除)。 我建议它不太可能从未来的C++标准中删除,只要向后兼容 C 被认为是重要的或可取的。

<cmath>是 C++ 标准中指定的标头。 它提供了与C<math.h>基本相同的功能,只是名称(除了几个宏)驻留在命名空间std中。

类似的情况也适用于<stdio.h>(C)和<cstdio>(C++),除了流I/O的使用(例如<iostream>)在C++中受到鼓励。

标准 C++ 标头从不具有.hpp扩展名。 标头的命名约定是某些人鼓励的约定,但不是正式要求的。

C++11 Standard说:

D.5C 标准磁带库接头

1 为了与 C 标准库和 C Unicode TR 兼容,C++ 标准库提供了 25 个 C 标头,...

包含这些标头声明为已弃用,这意味着:

本标准当前

版本的规范性,但不保证在未来的修订版中成为本标准的一部分。

所以他们仍然(只是)C++的一部分.

它们是为了兼容性而提供的,即允许程序员使用符合编译器的标准编译最初为C编写的程序C++只需很少或无需修改。这意味着不必将#include语句从<stdio.h>更改为<ctsdio>

因此,cplusplus.com中给出的示例实际上是符合C++的标准,恰好与编译器兼容C90C99C编译器。大概他们这样做是因为描述数学库的页面提供了CC++语言的信息,遵循C90C99C++98C++11的标准。

所以要回答具体问题:

1)他们为什么使用

<stdio.h>

我以为这是给C的,而不是真的给C++的?

这是为了C++C的兼容性。据推测,他们使用它,因此代码也将在符合C编译器的C90/C99上进行编译,页面给出了规范。

1)他们为什么使用

<math.h>

我虽然 .h 代表 C 头文件而不是 .hpp C++头文件?

不。该标准没有指定扩展文件应使用的内容。实际上,许多C++项目使用.h作为其头文件的扩展名。

我觉得如果老师问"你为什么使用 C 头文件?

鉴于C兼容性标头已被弃用(尽管可能不会消失),我建议最好使用<cstdio><cmath>版本。然而,仅仅因为你选择了库函数而以某种方式编写C代码的想法是错误的。如果通过C++编译器馈送的代码是合法的C++那么它是C++.它可能在性质上更具程序性,在哲学上较少以对象为导向,但它仍然是完全C++的。许多,许多,许多C++程序使用用其他语言编写的库,尤其是C。这不会使这些程序以某种方式C

关于你的第一个问题,使用的
printf函数需要stdio.h 关于你的第二个问题,math.h 可以被 C 和 C++ 使用,但 cmath 将在 std 命名空间中定义方法,而 math.h 将在全局命名空间中定义这些方法

一般来说,你可以在C++代码中使用C代码,通常不会有任何问题,尤其是在处理像math.h这样的知名库时。

<math.h>

(对于C)和<cmath>(对于C++)在函数的基本用法上非常相似。<cmath>在更高级的阶段开始有所不同,涉及模板、STL 和一般的面向对象编程。

无论你使用C还是C++,都可以使用<math.h>,但我认为相反(C<cmath>)不起作用。我建议<cmath>C++,因为它与 相同,但具有更强大的 OOP 功能。