【发布时间】:2016-04-12 08:06:38
【问题描述】:
我正在通过以下方式检查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
【问题讨论】:
-
您似乎对编译时和运行时的区别感到困惑。
-
看看
NSFoundationVersionNumber常量。也许这对您来说会是更好的解决方案。 -
@trojanfoe 你的意思是,所以我们不能根据已经定义的宏导入标头?
-
不,当然可以,但请考虑一下该宏正在扩展到什么。它只能在运行时评估,而不是编译时评估,因此在您尝试制作时不会影响包含哪个文件。如果您尝试根据部署目标包含不同的类,在我看来您想要
__IPHONE_OS_VERSION_MIN_REQUIRED。 -
@trojanfoe 感谢在编译时如何评估#define belowiOS9 SYSTEM_VERSION_LESS_THAN(@"9.0")。其次,#define belowiOS9 SYSTEM_VERSION_LESS_THAN(@"9.0") 或 #define belowiOS9 __IPHONE_OS_VERSION_MIN_REQUIRED 更好
标签: ios objective-c macros