あなたがそうのように、__has_feature
を使用することができます。
#if __has_feature(objc_arc)
// ARC is On
#else
// ARC is Off
#endif
をあなたもGCCでビルドしたい場合は(AppleのGCCは、ARCに対応していません)、あなたもコンパイラを決定するために、以下が必要になる場合があります
#if defined(__clang)
// It's Clang
#else
// It's GCC
#endif
更新
組み合わせは、彼らは一般的な形式を取る:を0
#if defined(__clang)
#if !defined(__has_feature)
// idk when clang introduced this
#error This version of clang does not support __has_feature
#endif
#define MON_IS_ARC_ENABLED_IN_THIS_TRANSLATION __has_feature(objc_arc)
#else
// for every compiler other than clang:
#if defined(__has_feature)
#error Another compiler supports __has_feature
#endif
#define MON_IS_ARC_ENABLED_IN_THIS_TRANSLATION 0
#endif
あなたのソースには、
#define
秒の
MON_IS_ARC_ENABLED_IN_THIS_TRANSLATION
を使用してください。
サポートを追加するコンパイラがサポートを追加する場合は、そのためのケースを追加する必要があります(この場合、コンパイラエラーはこの場合エラーを捕捉する可能性があります)。
これは、(コメント内の会話に基づいて)予約済み識別子の定義を回避する方法を示す余分なチェックがあります。網羅的ではなくデモンストレーションです。条件付きの__has_feature
チェックを頻繁に書くことが分かっている場合は、その定義のために新しいマクロを定義して、定義を減らして単純化することができます。
@ Suulthanこの機能には妥当な使用例があります。ライブラリのユーザーがARC対応のソースを取得してARCサポートなしでコンパイルするだけでなく、数日前に私に起こったメモリを全面的に漏らしてしまうのを防ぐようにします。つまり、質問で与えられたサンプルコードは実際には乱雑に見えます。 – zoul
@zoulあなたはユーザーができることは決して準備できません。あなたのケースでは、ARCがオンの場合、単純なアサーションで十分です。ARCとMRCの両方と互換性のあるコードを作成しようとすると、読みにくい難解なコード(または混乱)で終了する必要があります。そして、読み込み不可能なコードは難しいです。 – Sulthan
合意して、私が心に留めていたものです。 – zoul