4

これを行うフレームワークコードがいくつかあります。

#ifdef USE_DOUBLE
typedef double real;
#else
typedef float real;
#endif

しかし、次のように定義されUSE_DOUBLEている場合(つまり、real == double)にこのタイプを使用しようとすると、次のようになります。

- (id) initSomeObject:(real)arg  andSomeOtherStuff:(id)thing
{
    self = [super init];
    if (self)
    {
        field = arg;
    }
}

[someObject initSomeObject:2.0  andSomeOtherStuff:nil];

値は完全に破棄され、arg5.3...e-315として表示されます。ただし、スイッチUSE_DOUBLE をオフにすると、の値は2.0完全に機能します。これは、iPhone4でXcode4.3.3とLLVM3.1を使用する最新のiOS5以降にあります。iOSはdoubleをうまく処理しませんか?私のUSE_DOUBLE旗は常に未定義にする必要がありますか?

4

1 に答える 1

0

定義USE_DOUBLEと型realは、私のアプリケーションが使用する静的ライブラリで定義されています。が正しく機能するには、フレームワーククライアントアプリケーション同じ値USE_DOUBLEに設定する必要があることがわかりました。私のアプリケーションは別のコンパイルユニットと見なされていたようです。つまり、定義されていないため、フロートでした。これにより、ランタイムが値の精度を狭め、予期しない/未定義の動作を引き起こしました。私のアプリケーションプロジェクトに追加すると、この問題は解決したようです。typedefUSE_DOUBLEreal#define USE_DOUBLE

于 2012-09-05T18:21:05.537 に答える