23

我在 Linux 中编译我的程序 - 它具有以下行:

std::sqrt((double)num);

在 Windows 上,没问题。但是,在 Linux 上,我收到一个错误:

sqrt不是std

我已经包含了math.h

那有什么问题?

4

2 回答 2

34

将指令更改为#include <cmath>. 保证表单的 C++ 标头<cxxxxxxx>在命名空间中具有标准名称std(并且可以选择在全局命名空间中提供它们)。<xxxxxx.h>不是。

于 2013-05-13T09:01:04.580 回答
6

这仅仅是因为<math.h>没有在namespace std. 仅出于兼容性原因,它已包含在 C++ 标准中。正确的 C++ 包含将是<cmath>.

§D.5,2

每个 C 标头(每个都有一个名为 form 的名称)的name.h行为就好像每个由相应cname标头放置在标准库命名空间中的名称都放置在全局命名空间范围内一样。未指定这些名称是否首先在命名空间的命名空间范围内声明或定义,然后通过显式using-declarationsstd注入全局命名空间范围。

您的代码在 Windows 下运行纯属运气 - 如果您想这样称呼它。最后一句暗示了在 windows 下可能发生的事情,但在 linux 下不会发生:在 windows 下,显然这些名称在全局命名空间和命名空间中都是有效的std

于 2013-05-13T09:01:04.893 回答