这是一个libstdc++
错误报告中记录的错误使用 c++0x 支持(并使用命名空间 std)构建时,std 函数与 C 函数冲突 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891复制样本与OP非常相似:
#include <stdlib.h>
#include <cmath>
#include <stdio.h>
using namespace std;
int main(int argc, char** argv)
{
double number = 0;
if (isnan(number))
{
printf("Nan\n");
}
return 0;
}
其中一条评论说:
我不认为这是问题所在,因为 libstdc++ 始终在全局命名空间中声明名称,即使它在 C++03 中无效 - 我们没有为 C++0x 更改它(所发生的只是放宽标准以反映实际实施的现实)
这最终可能会得到修复,直到错误报告中提供的解决方案如下:
通过调用 ::isnan 或 std::isnan 显式限定 isnan
Using ::isnan
据我所知有效C++11 之前的版本 http://melpon.org/wandbox/permlink/uHfLn62xyo4xPQKD and in C++11 http://melpon.org/wandbox/permlink/7GkmqwpwyZBv0zfp.
当然这是一个libstdc++
具体的解决方案,它看起来有效libc++
但如果你需要支持一个编译器,而这不起作用,你可能不得不求助于使用#if/#else
.
注意,如 M.M 所示,具有isnan
标记的 constexpr 是不合格的,这是一个也是已知问题 https://stackoverflow.com/q/27744079/1708801尽管它对这个特定问题没有贡献。
另请参阅相关错误报告:[C++11] 重载的“isnan”调用不明确 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60407 and 使用 bool 返回类型识别内置函数 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54130。第二个讨论可能的libstdc++
解决方案。
Update
如果你想要 gcc/clang 解决方案,看起来它们都支持__builtin_isnan
, see 关于内置函数的 gcc 文档 https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html了解更多信息。另请参阅此 glibc错误报告 https://sourceware.org/bugzilla/show_bug.cgi?id=15367用内置替换 isnan 等人。