首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><math.h>是C还是C++?

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

Stack Overflow用户
提问于 2016-06-19 07:02:14
回答 4查看 8.2K关注 0票数 7

我需要在.cpp (c++)源文件中使用自然对数函数。现在,我当然可以通过一个快速的google搜索和一个简单的库解决方案来完成这个任务。但我有点糊涂..。

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

代码语言:javascript
复制
/* 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)他们为什么要使用

代码语言:javascript
复制
<stdio.h>

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

2)他们为什么要使用

代码语言:javascript
复制
<math.h>

我认为.h代表的是C头文件,而不是.hpp C++头文件?

忘记stdio的使用(反正我会使用iostream ),但即便如此,通过使用

代码语言:javascript
复制
<math.h>

感觉我在写C代码,而不是C++代码。我通过一个教学课程学习C++,教练在第一周介绍了C,然后说我们将不再使用C,但是从现在开始我们将使用C++。如果老师问:“你为什么要使用C头文件?你应该在C++工作”,我觉得我无法解释自己。

任何解释都很感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-19 07:09:08

<math.h>是C标准中指定的报头。它的使用在C++中是受支持的,但是所有的C++标准都正式反对它(这意味着,它大约意味着可能从未来的标准中删除)。我认为它不太可能从未来的C++标准中删除,因为只要向后兼容C被认为是重要的或可取的。

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

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

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

票数 11
EN

Stack Overflow用户

发布于 2016-06-19 11:55:11

C++11 Standard说:

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

这些标头的包含被声明为不建议使用,意思是:

标准当前版本的规范,但不保证在今后的修订中成为标准的一部分。

所以他们仍然(仅仅)是C++的一部分。

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

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

因此,要回答具体问题:

( 1)他们为什么要使用 我以为这是为C而不是真正的C++?

这是为了C++C的兼容性。想必他们会使用它,所以代码也将在符合C90/C99C编译器上编译,页面给出了相应的规范。

( 1)他们为什么要使用 我认为.h代表的是C头文件,而不是.hpp C++头文件?

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

如果老师问:“你为什么要用C头文件?”我觉得我无法解释自己。

考虑到C兼容性标头是不推荐的(尽管可能不会使用任何地方),我建议最好使用<cstdio><cmath>版本。但是,仅仅因为选择库函数而编写C代码的想法是错误的。如果它是通过一个C++编译器提供的合法C++代码,那么它就是C++。它可能在性质上更多地是程序性的,而在哲学上则不那么面向对象,但是它完全是C++。许多,很多,许多C++程序使用用其他语言编写的库,特别是C。这并不能使这些程序在某种程度上成为C

票数 2
EN

Stack Overflow用户

发布于 2016-06-19 07:09:52

关于您的第一个qustion,使用printf函数需要stdio.h。

关于您的第二个问题,math.h可以被C和C++使用,但是cMath将在std命名空间中定义方法,而math.h将定义全局命名空间中的方法。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37904753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档