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