【问题标题】:Macro in Objective-C calling isEqualToString: produces error about invalid tokenObjective-C 中的宏调用 isEqualToString:产生关于无效令牌的错误
【发布时间】:2016-03-30 18:41:51
【问题描述】:

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

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

然后执行以下操作:

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

我在#if SOME_DEF 行收到以下错误:

预处理器表达式开头的标记无效

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

【问题讨论】:

  • 您将其作为一个宏而不只是一个函数来做这件事有什么原因吗?我可以根据经验告诉你,最好尽可能避免使用宏。
  • 您是否希望在预处理阶段评估 isEqualToString: 调用?

标签: ios objective-c macros


【解决方案1】:

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

#if [[TTys getString] isEqualToString:ANOTHER_STRING]

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

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

 #if expression

 controlled text

 #endif /* expression */ 

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

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

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

来自GCC documentation。

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

if(SOME_DEF) {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多