<math.h>是用于C或C++的吗?

7
我需要在一个 .cpp(c++)源文件中使用自然对数函数。当然,我可以通过快速的谷歌搜索和简单的库解决方案来实现这一点。但是我有些困惑... 在 cplusplus.com 网站上在 reference/cmath/log/ 下,他们提供了一个如下所示的 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) = %f\n", 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++”,我无法解释清楚。

非常感谢任何解释。


4
在C++中使用<cmath>而不是<math.h> - Paul R
这个名称的头文件在C和C++标准库中都有提供,通常是同一个文件。 - Benjamin Lindley
@Paul,你回复得真快。我看到了,但是在另一个cmath vs math.h的stackoverflow问题中,提供的答案说“它可能会在一个编译器上编译,但在另一个编译器上不行。因此最好使用[math.h]”。这让我更加困惑了。 - Runner Bean
但为什么要用.h而不是.hpp呢? - Runner Bean
4
大多数带有.h后缀的标准C库头文件都有对应的C++版本,该版本处理了std命名空间,添加了一个c前缀并省略了.h后缀。 - Paul R
4个回答

11

<math.h>是C标准中指定的头文件。虽然C++支持它的使用,但是所有的C++标准都正式弃用了它(这意味着将来可能会从标准中删除)。我认为只要向后兼容到C被认为是重要或可取的,它很可能不会被从未来的C++标准中删除。

<cmath>是C++标准中指定的头文件。它提供的功能基本上与C的<math.h>相同,只是名称(除了一些宏之外)存储在命名空间std中。

<stdio.h>(C)和<cstdio>(C++)也有类似的情况,只是在C++中鼓励使用流I/O(例如<iostream>)。

标准C++头文件从不具有.hpp扩展名。该命名约定对一些人来说是鼓励性的,但并不是正式要求的。


2
“C++11标准”如下所述:
D.5 C标准库头文件
为了与C标准库和C Unicode TR兼容,C++标准库提供了25个C头文件…
这些头文件的包含被声明为弃用,意思是:
规范适用于当前版本的标准,但不保证在未来修订版中仍然存在。
因此它们仍然(刚刚)是C++的一部分。
它们被提供是为了实现兼容性,即允许程序员使用符合标准的C++编译器编译原本是用C编写的程序,而无需或只需进行很少的修改。这意味着像不必将#include语句从改为之类的事情。
所以,cplusplus.com上给出的示例实际上是符合标准的C++,只是兼容C90和C99符合标准的C编译器。他们可能这么做是因为描述数学库的页面提供了符合C90、C99、C++98和C++11标准的C和C++语言信息。
因此回答具体问题:

1) Why are they using

<stdio.h>

I thought this was for C and not really for C++ ?

这是为了与C兼容而使用的C++。据推测,他们使用它是为了让代码也能在符合C90/C99规范的C编译器上编译,该页面提供了规格说明。

1) Why are they using

<math.h>

I though the .h represented C header files rather than the .hpp C++ header files?

不,标准没有规定文件应该使用什么扩展名。实际上,许多C++项目使用“.h”作为头文件的扩展名。
“我觉得如果老师问我‘为什么使用C头文件’,我无法解释自己。”
考虑到C兼容性头文件已经被弃用(虽然可能不会消失),我建议最好使用和版本。但是,因为库函数的选择而认为你在编写C代码是错误的想法。如果它是合法的C++代码通过C++编译器,则它是C++。它可能更具过程性特点,哲学上不太面向对象,但它仍然完全是C++。许多许多C++程序使用其他语言编写的库,尤其是C。这并不意味着这些程序以某种方式是C。

1
关于你的第一个问题,printf函数需要使用stdio.h头文件
关于你的第二个问题,math.h可以被C和C++使用,但是cmath会在std命名空间中定义方法,而math.h会在全局命名空间中定义方法
通常情况下,你可以在C++代码中使用C代码,这通常不会有任何问题,特别是当处理像math.h这样的知名库时。

是的,我明白在使用printf时需要引入stdio头文件,但为什么C++参考站点也这样做?这显然是C而不是C++吧? - Runner Bean
你是正确的,这是C语法,并且在使用C++时应该使用std::cout(iostream)来打印内容。尽管如此,在C++中使用stdio也没有问题,它有完整的支持,老实说,一些人只是习惯于使用它。 - Ishay Peled
2
还有cstdio,它至少利用了std::命名空间的优势,和cmath一样。 - AliciaBytes
2
@RunnerBean 如果你愿意,你可以尝试一下其他的参考网站,比如cppreference。我个人认为它更加清晰,并且有更好的示例,虽然我已经很久没有看过cplusplus.com了,这可能只是我的个人偏好。 - AliciaBytes

1
"<math.h>"(用于C语言)和"<cmath>"(用于C++语言)在基本函数使用方面非常相似。但是在涉及到模板、STL和面向对象编程等更高级的阶段,"<cmath>"开始有所不同。
无论您使用C还是C++,都可以使用"<math.h>",但我认为反过来使用"<cmath>"(用于C语言)是不行的。我建议对于C++语言,使用"<cmath>",因为它与"<math.h>"相同,但具有更强大的面向对象编程功能。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接