我需要在.cpp (c++)源文件中使用自然对数函数。现在,我当然可以通过一个快速的google搜索和一个简单的库解决方案来完成这个任务。但我有点糊涂..。
在cplusplus / com网站上,他们有一个如何使用日志函数的示例,如下所示
/* 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++工作”,我觉得我无法解释自己。
任何解释都很感激。
发布于 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扩展。标题的命名约定是一些人鼓励的约定,但并不是正式要求的。
发布于 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++的标准,这些标准恰好与C90和C99兼容的C编译器兼容。他们这样做大概是因为描述数学库的页面按照C90、C99、C++98和C++11的标准为C90和C++语言提供了信息。
因此,要回答具体问题:
( 1)他们为什么要使用 我以为这是为C而不是真正的C++?
这是为了C++与C的兼容性。想必他们会使用它,所以代码也将在符合C90/C99的C编译器上编译,页面给出了相应的规范。
( 1)他们为什么要使用 我认为.h代表的是C头文件,而不是.hpp C++头文件?
不是的。标准没有指定应该使用什么扩展名文件。实际上,许多C++项目使用.h作为其头文件的扩展名。
如果老师问:“你为什么要用C头文件?”我觉得我无法解释自己。
考虑到C兼容性标头是不推荐的(尽管可能不会使用任何地方),我建议最好使用<cstdio>和<cmath>版本。但是,仅仅因为选择库函数而编写C代码的想法是错误的。如果它是通过一个C++编译器提供的合法C++代码,那么它就是C++。它可能在性质上更多地是程序性的,而在哲学上则不那么面向对象,但是它完全是C++。许多,很多,许多C++程序使用用其他语言编写的库,特别是C。这并不能使这些程序在某种程度上成为C。
发布于 2016-06-19 07:09:52
关于您的第一个qustion,使用printf函数需要stdio.h。
关于您的第二个问题,math.h可以被C和C++使用,但是cMath将在std命名空间中定义方法,而math.h将定义全局命名空间中的方法。
一般来说,您可以在C++代码中使用C代码,这通常不会有任何问题,特别是在处理math.h这样的著名库时。
https://stackoverflow.com/questions/37904753
复制相似问题