【问题标题】:Macros conditional compiling not working宏条件编译不起作用
【发布时间】: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


【解决方案1】:

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

也许您在预处理条件的行中遇到错误。

#if defined SYSTEM_VERSION_LESS_THAN(@"9.0")

#if 需要在编译时进行评估。但是[[UIDevice currentDevice] systemVersion] 只是在运行时有价值。这就是编译器无法编译这一行的原因。

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

【讨论】:

  • “所以它不能放在宏中”不是真的。这样做的正确方法是什么?
  • @trojanfoe 抱歉。我错了。我通常在包装器中使用静态函数来解决这些问题。非常感谢。
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多