У меня есть небольшое тестовое приложение, которое использует isnan
из <math.h>
:
#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;
}
Сборка и запуск:
Работает на С++ 98
$ g++ -std=c++98 main.cpp; ./a.out 1 1
С++ 11 и С++ 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) ^
Обратите внимание, что порядок включения не важен. Если я включаю <cmath>
до <math.h>
или после, результат будет таким же.
Вопросы
- Почему
isnan
ушел? - Без необходимости возвращаться и изменять старый код для компиляции в соответствии с новым стандартом, есть ли способ исправить это?