当现代运行时或自动合成属性不可用时,中止编译

时间:2013-03-17 02:59:17

标签: objective-c cocoa

我写了一个Mac + iOS库,它依赖于自动合成属性。我有人尝试在32位下编译它,忽略一堆编译器警告,并在运行时获得无法识别的选择器。

由于没有实现一堆getter和setter,所以代码都不会工作,我宁愿用#error来阻止它们。

我以为我可以这样做:

#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位英特尔架构之外还有其他一些会导致此问题的实例,例如旧版本的Mac OS。

是否有更好的宏来检查自动合成属性或现代运行时的可用性?

1 个答案:

答案 0 :(得分: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