C++中的Math接口与cMath有何区别?

10

我的构建系统 MacOS 10.6.3 上的 POSIX 数学库接口是 math.h,但是在我的目标系统上,接口文件的名称是 cmath.h。在学校里我们使用 cmath,我想确保我的项目在提交时编译通过,应该如何实现。学校的服务器和工作站都是运行 Windows XP 的 x86 平台。GCC 在两个平台上都可用。


你的“目标系统”是什么?使用哪个编译器,哪个操作系统?请问您的老师cmath.hmath.h之间有什么区别?是<cmath>还是<cmath.h> - Basile Starynkevitch
抱歉,我的主机系统是macOS,目标系统是Windows XP。如果我的教授知道答案,我就不必在这里问了。 - awiebe
1个回答

23

C++标准中,数学库函数定义在两个头文件中:

<cmath>

将它们包含在命名空间std中(例如std::sin),而

<math.h>

将它们包含在全局命名空间中(因此只需使用 sin)。

两者之间还有其他的差异:虽然 <math.h> 包含了所有 C 数学函数,其中针对不同类型具有不同名称,例如

double sin(double);
float sinf(float);
long double sinl(long double);

等等,<cmath> 包含重载函数,例如

namespace std {
    double sin(double);
    float sin(float);
    long double sin(long double);
}

等等。(<cmath>可能还会导出来自<cmath>sinf,但您不能在可移植程序中依赖于此.)

最后,在C标准库中的fabsfabsffabsl函数已成为<cmath>std::abs重载的一部分。

虽然两个头文件都是标准的,但您应该真正偏爱<cmath>,因为<math.h>仅用于与预标准C++和C向后兼容。

在标准C++中没有<cmath.h>这样的东西。


好的。删除了我的答案,因为您已经涵盖了重要内容。我认为提到<cfoo>命名风格用于其他标准库也是值得的,但我将把这留给您。 - Harper Shelby
@HarperShelby:把它放在最后面。我希望原帖作者能看到这里,因为这是一个相当长的列表 ;) - Fred Foo
目标是获取有用的信息 - 你可以引导马到水边,但不能强迫它喝水。 - Harper Shelby
好的,所以在C++中,头文件名应该不带“.h”进行指定。这就是为什么理论上我无法链接cmath的原因,但是在我的系统上并没有关于cmath的manpage,所以我不知道它是否已经正确安装了。同时,我的笔记本电脑刚刚坏了,所以稍后再来查看它是否还存在问题。 - awiebe
@awiebe:我从未见过一个具有C++库手册页的系统。 手册页往往只涵盖C库。 - Fred Foo
在macOS上,C++标准库的位置不在我预期的位置,这可能是我的系统配置错误(我的$PATH变量缺少路径),因为从命令行运行gcc会导致错误。但是,使用命令行工具创建一个xcode项目-> c ++ -> stdc ++会将适当的路径添加到目标中,从而解决了这个问题。 - awiebe

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