4

自動合成されたプロパティに依存する Mac + iOS ライブラリを作成しました。誰かに 32 ビットでコンパイルしてもらい、一連のコンパイラ警告を無視して、実行時に認識されないセレクターを取得してもらいました。

#errorたくさんのゲッターとセッターを実装しないとコードは機能しないので、代わりに a でそれらを停止したいと思います。

私はこれができると思った:

#if !__has_feature(objc_default_synthesize_properties)
#error This library requires the modern runtime and will not compile under 32-bit
#endif

しかし、それは効果がありません。

必要な結果を得るには、これを行う必要があります。

#if !__has_feature(objc_default_synthesize_properties) || defined(__i386__)
#error This library requires the modern runtime and will not compile under 32-bit
#endif

32 ビット Intel アーキテクチャ以外にも、古いバージョンの Mac OS など、問題を引き起こすインスタンスがあることはわかっています。

自動合成されたプロパティまたは最新のランタイムの可用性をチェックするためのより良いマクロはありますか?

4

1 に答える 1

1

モダン ランタイムは Mac OS X 10.5 から利用できるようになったため#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5、特定のシステムがモダン ランタイムをサポートしている場合、マクロは正しく評価されるはずです。アーキテクチャのチェックi386も必要になる場合があります。上記は、で確認することもできますNSAppKitVersionNumber10_5

iOS では、すべての iOS デバイスが最新の Objective-C ランタイムをサポートしているため、このチェックは不要です。したがって、変数合成もサポートされています。

これは、Steven Fisher の回答も組み込んだマクロです。どちらのプラットフォームでも動作し、最新のコンパイラと最新のランタイムの両方を確認する必要があります。

#if !( defined(__clang__) && __has_feature(objc_default_synthesize_properties) && \
       ( TARGET_OS_IPHONE || \
         ( NSAppKitVersionNumber10_5 && !defined(__i386__) ) ) )
#error This library requires autosynthesized properties
#endif
于 2013-03-17T03:13:08.173 に答える