Ios 宏条件编译不工作

Ios 宏条件编译不工作,ios,objective-c,macros,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 "SomeCla

我正在按以下方式检查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
Objective-C预处理器不是编译器的一部分,而是一个 编译过程中的单独步骤。简单地说,一个 Objective-C预处理器只是一个文本替换工具,它 指示编译器在实际编译之前进行所需的预处理 汇编

可能您在一行中得到错误,这是预处理条件

#if defined SYSTEM_VERSION_LESS_THAN(@"9.0")
#if
需要在编译时进行评估。但是
[[UIDevice currentDevice]systemVersion]
在运行时才有价值。这就是为什么编译器不能编译这一行


正如@Trojacfee所说,尝试使用
\ifdef\u IPHONE\u OS\u VERSION\u MIN\u REQUIRED

您似乎混淆了编译时间和运行时的差异。请查看
NSFoundationVersionNumber
常量。也许这对您来说是一个更好的解决方案。@您的意思是,我们不能基于已定义的宏导入标题?当然可以,但请考虑一下宏的扩展方向。它只能在运行时进行计算,而不能在编译时进行计算,因此在您尝试创建文件时,它不会影响包含的文件。在我看来,如果您试图根据部署目标包含不同的类,您需要
\uuIphone\u OS\u VERSION\u MIN\u REQUIRED
。@特洛伊木马程序感谢如何在编译时计算