2015-10-06 44 views
0

我想在我的C++代碼中使用isfinite函數。如何使用GCC 4.3在-std = gnu ++ 98模式下提供C99數學函數?

此功能在默認math.h中可用,但不在默認版本(-std = gnu ++ 98)cmath中。

所以,如果我包括math.h,並確保cmath不包括在內,那麼isfinite可用。

如果其他任何頭文件,如valarray包含cmath,則isfinite已不存在。

GCC 4.3中的C++ 11是實驗性的,所以我不想打開它。

有沒有辦法在C++ 98代碼中使用C99 math.h

我發現this related question on testing NaN,非C++ 11解決方案看起來非常難看。

編輯

如通過@old_mountain指向的評論,當使用cmathisfinite仍然可用,但是需要std::isfinite調用,使用std命名空間。

+1

你使用'cmath'和'std :: isfinite'獲得錯誤嗎?顯然它運行良好[g ++ 4.3.6](http://melpon.org/wandbox/permlink/fFGmUSXLyMYxmQpx)。如果你只使用'isfinite'(沒有命名空間),你會得到一個錯誤 –

+0

是噓或'std :: tr1'不是一個選項? – NathanOliver

回答

1

包括<cmath>並使用std::isfinitestd命名空間。

應該work fine (g++4.3.6)

+0

嗯,它的工作原理!謝謝! – user3528438

+0

該標準是否符合標準? isfinite被標記爲C++ 11,所以它可能是一個錯誤,GCC允許使用它而不使用std = C++ 11標誌 – GameDeveloper

0

創建自己的功能!據cppreference該功能可作爲C++的11個標準的一部分,所以我不知道是便攜式使用std::isfinite與GCC 4.3.X

isfinite.cpp

#include <math.h> 

bool myIsFinite(float arg){ 
    return isfinite(arg)!=0; 
} 


bool myIsFinite(double arg){ 
    return isfinite(arg)!=0; 
} 

ISFINITE。 HPP

bool myIsFinite(float arg); 
bool myIsFinite(double arg); 


如果你仍然想調用一個名爲 「ISFINITE」 功能(我不建議):

isfinite.cpp

bool myIsFinite(float arg); 
bool myIsFinite(double arg); 

bool isfinite(float arg){ 
    return myIsFinite(arg); 
} 


bool isfinite(double arg){ 
    return myIsFinite(arg); 
} 

#include <math.h> 

bool myIsFinite(float arg){ 
    return isfinite(arg)!=0; 
} 


bool myIsFinite(double arg){ 
    return isfinite(arg)!=0; 
} 

isfinite.hpp

bool isfinite(float arg); 
bool isfinite(double arg); 

警告

使用此文件將無法執行「單個翻譯單元」之類的操作。所以你必須從任何一個編譯單元中排除「isfinite.cpp」並單獨編譯它。

+0

我嘗試了類似的東西。我編寫了一個'extern「C」'封裝到c版本並在C99模式下進行編譯。我做了一些研究,發現在C++代碼中使用'.h' C頭文件不是很好的做法。 – user3528438

+0

這不是C,而是C++代碼。唯一的缺點是C使用了大量的宏來污染命名空間,但正如你所看到的,包含'math.h'是在一個小的C++文件中完成的,它可以防止包含'isfinite.hpp'的任何命名空間污染代碼。正如你所看到的,我並沒有使用「extern」(這個名字改變了,這可能是另一個需要解決的問題,但我又用C++解決了這個問題,並且隱藏了所有的C代碼) – GameDeveloper

相關問題