7

XCode 5 を使用してプロジェクトをビルドしようとすると、次のエラーが発生します。

Use of undeclared identifier 'FLT_EPSILON'

確認したところ、FLT_EPSILON (Xcode では茶色で表示されます) が「float.h」ファイルで定義されています。

私は何を間違っていますか?


これは、FLT_EPSILON が使用されるコードです。

if (someTimeInterval < 0.03 - FLT_EPSILON) {
    someTimeInterval = 0.1;
}

iPhone 5S シミュレーター (64 ビット) でテストしようとしていたため、これが発生していることがわかった。

64 ビット シミュレータを使用した場合の違いがよくわかりません。FLT_EPSILON の代わりに何を含める必要がありますか? また、64 ビットで機能しないのはなぜですか?

4

3 に答える 3

3

解決策は、プロジェクト内のモジュールを無効にすることです。これを行うには、ビルド設定に移動し、「モジュールを有効にする」を「いいえ」に設定します。

それはclangバグです。モジュール (-fmodulesフラグ) はまだ実験的な機能であり、Objective-C と C/C++ モジュールを混在させると、いくつかのバグが発生する可能性があります。

github で私のデモ プロジェクトを参照してください: TestEpsilon

最初のターゲットはモジュールを使用し、2 番目のターゲットはモジュールを使用しません。「クリーンな」ビルドを確実に取得するために、ビルド前のスクリプトを追加DerivedDataしてクリーンアップしました。ModulesCache

于 2014-02-25T12:01:15.753 に答える
2

これは私のために働いた:

#ifndef FLT_EPSILON
    #define FLT_EPSILON __FLT_EPSILON__
#endif

(これは で定義されている方法ですfloat.h)

于 2013-11-08T22:12:16.470 に答える
1

これが 64 ビット デバイスでのみ機能しなかった理由はわかりません。

しかし、ここに解決策があります:

MobileCoreServices.framework がインストールされていることを確認すると、正常に動作するはずです

輸入<MobileCoreServices/MobileCoreServices.h>

于 2013-10-22T22:11:51.613 に答える