隱藏在C 14 / C 11?
math.h> ;:s中的isnan:
#include <iostream> #include <math.h> int main() { double d = NAN; std::cout << isnan(d) << '\n'; return 0; }
建立並執行3種不同的標準:
06001
現在我們還包括<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作品
06003
C 11和C 14沒有,isnan沒有找到.
06004
注意包含的順序並不重要.如果我包括<cmath>之前<math.h>或者之後,結果是一樣的.
問題
>為什麼isnan走了?
>沒有必要回去修改舊的程式碼來編譯新的標準,有沒有辦法解決這個問題?
年:
> glibc<2.23的math.h宣告過時的X / Open int isnan(double);這與C99 / C11版本不相容(bool isnan(double);).
> glibc 2.23的math.h通過在C11或更高版本中不宣告isnan函式來修復它.
>他們仍然定義一個isnan巨集. #include<cmath>根據C標準要求的那個巨集.
> GCC 6的libstdc提供了自己的特殊的math.h頭,宣告一個bool isnan(double);在全域性名稱空間中(除非libc math.h宣告過時的簽名),還可以按照標準的要求核對巨集.
>在GCC 6之前,#include<math.h>簡單地包括你的libc的標題,所以巨集不是nuked.
> #include<cmath>總是打擾巨集.
淨結果,在C 11模式:
glibc <2.23, GCC <6: <math.h> uses the macro; <cmath> uses obsolete signature glibc >= 2.23, GCC <6: <math.h> uses the macro; <cmath> results in error glibc <2.23, GCC >= 6: <math.h> and <cmath> use obsolete signature glibc >= 2.23, GCC >= 6: <math.h> and <cmath> use standard signature
http://stackoverflow.com/questions/39130040/cmath-hides-isnan-in-math-h-in-c14-c11