4

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

由于如果不实现一堆 getter 和 setter,任何代码都无法工作,我宁愿用 a 来阻止它们#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 位 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 回答