<math.h>是C还是C++?
is <math.h> for C or C++?
我需要自然对数函数才能在.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++
的标准,恰好与编译器兼容C90
和C99
C
编译器。大概他们这样做是因为描述数学库的页面提供了C
和C++
语言的信息,遵循C90
、C99
、C++98
和C++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 功能。
- enum是C++中的宏变量还是整数变量
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 在命名空间中定义函数还是限定函数
- 架构决策:返回std::future还是提供回调
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 异常属于C++中的线程还是进程
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 如何在C++中确定文本文件中的元素是字符还是数字
- 返回值优化:显式移动还是隐式
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 为什么需要知道一个类是平凡的还是有平凡的构造函数
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在这种情况下,我真的复制了字节还是复制了字符?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- CIN是逻辑1还是0?
- i++还是++i更适合这个程序?
- 我应该将外部标头放在 .h 文件还是.cpp文件中?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?