我写了一个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。
是否有更好的宏来检查自动合成属性或现代运行时的可用性?
答案 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