宏条件编译不起作用

时间:2016-04-12 08:06:39

标签: ios objective-c macros

我正在按以下方式检查iOS版本

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

现在我想根据这个

编译一个类
#if defined SYSTEM_VERSION_LESS_THAN(@"9.0")
    #import "SomeClassBelowiOS9.h"
#else
    #import "SomeClassIniOS9AndAbove.h"
#endif

我收到错误令牌不是预处理器子表达式中的有效二元运算符

修改

它是这样的,但我不确定如果这是一个很好的解决方案,基本的想法是以更简单的方式重用宏

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define belowiOS9 SYSTEM_VERSION_LESS_THAN(@"9.0")

#if belowiOS9
    #import "SomeClassBelowiOS9.h"
#else
    #import "SomeClassIniOS9AndAbove.h"
#endif

1 个答案:

答案 0 :(得分:0)

  

Objective-C预处理器不是编译器的一部分,但它是一个   编译过程中的单独步骤。简单来说,一个   Objective-C预处理器只是一个文本替换工具   指示编译器在实际之前进行必要的预处理   汇编

也许你会在预处理条件的行中得到错误。

#if defined SYSTEM_VERSION_LESS_THAN(@"9.0")

#if需要在编译时进行评估。但是[[UIDevice currentDevice] systemVersion]在运行时才具有价值。这就是为什么编译器无法编译这一行。

正如@trojacfoe所说,试试#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED