Objective-C调用中的macrosisEqualToString:产生关于无效标记的错误

我试图定义一个这样的macros:

#define SOME_DEF [[TTys getString] isEqualToString:ANOTHER_STRING] 

然后执行以下操作:

 #if SOME_DEF ... #endif 
  • [TTys getString]返回一个NSString
  • ANOTHER_STRING在前面定义为#define ANOTHER_STRING "hello"

#if SOME_DEF行上出现以下错误:

预处理器expression式开始处的标记无效

基于这个SO问题,这可能是由编译时无法解决的问题引起的,但是我已经定义了一切。 我怀疑是isEqualToString方法,但我不知道另一种方法来做到这一点。

当您编写#if SOME_DEF ,预处理器将其parsing为:

 #if [[TTys getString] isEqualToString:ANOTHER_STRING] 

这不是#if预处理器指令的有效条件:

'#if'指令允许你testing算术expression式的值,而不是仅仅存在一个macros。 它的语法是

  #if expression controlled text #endif /* expression */ 

expression式是整数types的Cexpression式,受到严格的限制。 它可能包含

  • 整型常量。
  • 字符常量,它们将被解释为在正常代码中。
  • 加法,减法,乘法,除法,按位运算,移位,比较和逻辑运算(&&和||)的算术运算符。 后两者服从标准C的通常的短路规则。
  • macros。 在expression式值的实际计算开始之前,expression式中的所有macros都被展开。
  • 定义的运算符的用法,它允许您检查macros是否在“#if”中间定义。

  • 不是macros的标识符,都被认为是数字零。 这使您可以编写#if MACRO而不是#ifdef MACRO,如果您知道MACRO,则在定义时,将总是具有非零值。 不使用函数调用括号的函数式macros也被视为零。

从GCC文档 。

你可以做的是使用运行时评估的常规if语句:

 if(SOME_DEF) { ... }