我在linux中编译我的程序 - 它有以下几行:
std::sqrt((double)num);
在Windows上可以,但在linux上我得到'sqrt'不是'std'的成员 我有一个math.h的包含
它有什么问题?
答案 0 :(得分:18)
将指令更改为#include <cmath>
。 <cxxxxxxx>
形式的C ++标头保证在std
命名空间中具有标准名称(并且可以在全局命名空间中提供它们)。 <xxxxxx.h>
不是。
答案 1 :(得分:4)
这只是因为<math.h>
没有声明namespace std
中的函数。它仅出于兼容性原因已包含在C ++标准中。正确的C ++包含<cmath>
。
<强>§D.5,2强>
每个C头(每个头都有一个
name.h
形式的名称,就好像每个由相应的cname
标头放置在标准库名称空间中的名称放在全局名称空间范围内。未指定是否首先在名称空间std
的名称空间范围内声明或定义这些名称,然后通过显式 using-declarations 将其注入全局名称空间作用域。
你的代码在windows下运行是纯粹的运气 - 如果你想这样称呼它。最后一句提示暗示在windows下会发生什么,但不在linux下:在windows下,显然这些名称在全局命名空间和命名空间std
中都有效。