如何使用 GCC 4.3 在 -std=gnu++98 模式下使用 C99 数学函数?

How to make C99 math functions available in -std=gnu++98 mode with GCC 4.3?

我想在我的 C++ 代码中使用 isfinite 函数。

此功能在默认 math.h 中可用,但在 cmath.

的默认版本(-std=gnu++98) 中不可用

因此,如果我包含 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所指出的,当使用cmath时,isfinite仍然可用,但需要被std::isfinite调用,使用std 命名空间。

包含 <cmath> 并将 std::isfinitestd 命名空间一起使用。

应该work fine (g++4.3.6)

自己创建函数!根据 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);

警告

您将无法使用此文件执行 "single translation unit" 之类的操作。所以你必须从任何一个编译单元中排除 "isfinite.cpp" 并单独编译它。