8

我有一个stlTest2.cpp像这样的简单文件:

#include <jni.h>

#include <cmath>


bool isnan (void);

我正在移植的一些代码中有一些更复杂的东西。我的问题是这个。为什么在 NDK 之外使用 GCC 构建时这会起作用,但在使用 NDK 时不起作用?它给出的错误是这样的:

jni/stlTest2.cpp:6: error: expected unqualified-id before 'sizeof'
jni/stlTest2.cpp:6: error: expected ')' before 'sizeof'

直接原因是math.h(包括 via <cmath>)定义isnan为宏。为什么 ndk 之外的构建不包括#definefrom math.h,但这是?如果我注释掉代码中的包含,一切都很好,但这是不可接受的,因为这个问题会反复出现......很多。

4

2 回答 2

4

isnan宏是在 C99 中添加的。在 C++11 中,它被添加为命名空间中的一个函数,为andstd重载(所以一个典型的头文件,比如你的非 NDK GCC 可能正在使用,可能有这样的东西:floatdoublelong double<cmath>

#undef isnan

inline bool isnan(float ...) { ... }

inline bool isnan(double ...) { ... }

inline bool isnan(long double ...) { ... }

),但显然 NDK 还没有收到备忘录,并且仍然提供 C99 宏以方便使用。(isnan在 C++ 中从来不是宏,但在 TR1 添加之前std::tr1::isnan,并没有真正的 C++ 替代方案,因此多个 C++ 编译器提供了 C99 宏。)

您是否需要能够使用编译器提供的isnanstd::isnan?如果没有,那么你可以改变这个:

#include <cmath>

对此:

#include <cmath>

#undef isnan

(同样对于任何其他有问题的宏,只要您不需要它们)。

于 2012-01-07T01:56:54.223 回答
2

在 $ndk\sources\cxx-stl\gnu-libstdc++\libs\armeabi\include\bits\c++config.h (将 armeabi 更改为适当的)更改此:

/* #undef _GLIBCXX_USE_C99_MATH */

#define _GLIBCXX_USE_C99_MATH 1

然后再次清理并构建您的项目。

于 2012-01-10T23:13:27.387 回答