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( 経由でインクルードされた)がマクロとして<cmath>定義されていることです。isnanndk の外側のビルドに#definefrommath.hが含まれていないのはなぜですか? コード内のインクルードをコメントアウトすると、すべて問題ありませんが、この問題が繰り返されるため、それは受け入れられません....たくさん。

4

2 に答える 2

4

isnanマクロは C99 で追加されました。C++11 では、std名前空間の関数として追加され、 floatanddoubleおよびに対してオーバーロードされましたlong double(したがって、<cmath>非 NDK GCC がおそらく使用しているような典型的なヘッダーは、次のようなものになる可能性があります。

#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 マクロを提供していました。)

isnanコンパイラが提供するまたはを使用できるようにする必要がありますかstd::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 に答える