【发布时间】:2016-12-31 23:40:12
【问题描述】:
我这里有一个小测试应用程序,它使用来自<math.h> 的isnan:
#include <iostream>
#include <math.h>
int main()
{
double d = NAN;
std::cout << isnan(d) << '\n';
return 0;
}
在 3 种不同的标准下构建和运行:
$ g++ -std=c++98 main.cpp; ./a.out 1 $ g++ -std=c++11 main.cpp; ./a.out 1 $ g++ -std=c++14 main.cpp; ./a.out 1
现在我们还包括<cmath>,并同时使用isnan 和std::isnan 进行测试:
#include <iostream>
#include <cmath>
#include <math.h>
int main()
{
double d = NAN;
std::cout << std::isnan(d) << '\n';
std::cout << isnan(d) << '\n';
return 0;
}
构建并运行:
C++98 作品
$ g++ -std=c++98 main.cpp; ./a.out 1 1
C++11 和 C++14 没有,找不到isnan。
$ g++ -std=c++11 main.cpp main.cpp: In function ‘int main()’: main.cpp:10:25: error: ‘isnan’ was not declared in this scope std::cout << isnan(d) << '\n'; ^ main.cpp:10:25: note: suggested alternative: In file included from main.cpp:3:0: /usr/include/c++/5/cmath:641:5: note: ‘std::isnan’ isnan(_Tp __x) ^ $ g++ -std=c++14 main.cpp main.cpp: In function ‘int main()’: main.cpp:10:25: error: ‘isnan’ was not declared in this scope std::cout << isnan(d) << '\n'; ^ main.cpp:10:25: note: suggested alternative: In file included from main.cpp:3:0: /usr/include/c++/5/cmath:641:5: note: ‘std::isnan’ isnan(_Tp __x) ^
请注意,包含的顺序并不重要。如果我在<math.h> 之前或之后包含<cmath>,结果是一样的。
问题
- 为什么
isnan不见了? - 无需返回并更改旧代码以在新标准下编译,有什么办法可以解决这个问题吗?
【问题讨论】:
-
Clang 是使用 libc++,还是和 gcc 一样的 libstdc++?
-
@ildjarn
ldd说是一样的 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6)。我已编辑问题以删除 clang 部分。 -
看起来可能是库的错误。 gcc.godbolt.org 在 4.9.2 到 5.3 中失败,但在 6.1 上有效
-
@SteveLorimer 如果您在几天内没有找到任何东西,请给我一个 ping,我会悬赏。我真的很想知道发生了什么。