Вы можете использовать __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
Обновление
В совокупности они приняли бы общую форму:
#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
Тогда просто используйте MON_IS_ARC_ENABLED_IN_THIS_TRANSLATION
в своих источниках или для дальнейших #define
с.
Если компилятор, который вы используете, добавляет поддержку, вам придется добавить регистр для этого (и ошибки компилятора, вероятно, перехватят ошибку в этом случае, поскольку это, вероятно, запретит использование операций подсчета ссылок).
Обратите внимание, что здесь есть дополнительные проверки, чтобы продемонстрировать, как можно (и нужно) избегать определения зарезервированных идентификаторов (на основе разговора в комментариях). Это не исчерпывающая, а демонстрация. Если вы часто пишете условные __has_feature
проверки, вы можете определить новый макрос для этого, чтобы уменьшить и упростить определения.