Objective-C中的宏调用isEqualToString:产生有关无效令牌的错误

时间:2016-03-30 18:41:52

标签: ios objective-c macros

我正在尝试定义这样的宏:

R = 0
'Write to worksheet
RSNonResourceCosts.MoveFirst

Do Until RSNonResourceCosts.EOF
    For C = 1 To NRCols - 1
        FieldName = RSNonResourceCosts.Fields(C).Value

        If RSNonResourceCosts.Fields(Header(C)).Value <> "" Then
            CL(C) = CL(C) + 1
            WKS.Cells(200 + R, C) = RSNonResourceCosts.Fields(Header(C)).Value
        End If
    Next C

    RSNonResourceCosts.MoveNext
    R = R + 1
Loop

然后执行以下操作:

#define SOME_DEF [[TTys getString] isEqualToString:ANOTHER_STRING]
  • #if SOME_DEF ... #endif 返回NSString
  • [TTys getString]之前定义为ANOTHER_STRING

我在#define ANOTHER_STRING "hello"行上收到以下错误:

  

预处理程序表达式开头的令牌无效

基于此SO question,这可能是由于在编译时无法解决的问题引起的,但我已经定义了所有内容。我怀疑是 #if SOME_DEF方法,但我不知道另一种方法。

1 个答案:

答案 0 :(得分:1)

当您编写#if SOME_DEF时,预处理器会将其解析为:

#if [[TTys getString] isEqualToString:ANOTHER_STRING]

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

  

'#if'指令允许您测试算术的值   表达,而不仅仅是一个宏的存在。它的语法是

 #if expression

 controlled text

 #endif /* expression */ 
     

表达式是整数类型的C表达式,受到严格的限制。它可能包含

     
      
  • 整数常量。
  •   
  • 字符常量,被解释为它们   将是正常的代码。
  •   
  • 添加的算术运算符,   减法,乘法,除法,按位运算,移位,   比较和逻辑运算(&amp;&amp;和||)。后两者服从   标准C的通常短路规则。
  •   
  • 宏。所有的宏   在实际计算之前扩展表达式   表达式的价值开始了。
  •   
  • 使用定义的运算符,它允许   检查是否在'#if'中定义了宏。

  •   
  • 不是宏的标识符,它们都被认为是   数字为零。这允许你编写#if MACRO而不是#ifdef   MACRO,如果你知道定义的MACRO将永远有一个   非零值。函数式宏在没有函数调用的情况下使用   括号也被视为零。

  •   

来自GCC documentation

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

if(SOME_DEF) {
    ...
}