【问题标题】:Objective-C macro giving a parse error: Expected identifier [duplicate]给出解析错误的Objective-C宏:预期的标识符[重复]
【发布时间】:2013-03-24 07:58:55
【问题描述】:

以下宏给了我一个解析错误。看不出这里有什么问题。

 #define adjust(tag, x, y) if (self.tag==tag) { origin.x += x; origin.y += y; return origin; }

  ....

 adjust(20, 28, 265)

编辑:

查看随附的屏幕截图。我想使用宏扩展只是为了提高代码的可读性。这是一种非常本地化的用法,因此没有风险或重复使用等。

【问题讨论】:

  • origin 是一个结构体吗?或者这是 Rect 的一部分?
  • 问题是if (self.tag==tag) 扩展为if (self.20==20),比较重复的问题以获得可能的解决方案。
  • 谢谢马丁。 #define adjust(_tag, _x, _y) if (self.tag==_tag) { origin.x += _x;起源.y += _y;返回原点; } 成功了。

标签: objective-c macros


【解决方案1】:

您的宏引用了一个未定义的属性origin,如果它不存在于替换范围内,则在宏展开后会导致编译器错误。实际上,作为一个整体,您的宏并不是非常模块化。例如,您有对tagself 的引用,它们是

  1. 会非常符合上下文
  2. 如果在宏展开完成后不发生且具有特定含义,将导致编译失败

【讨论】:

  • +1 喜欢解释
  • 我同意宏不是模块化的。然而,编译器错误的实际原因是 self.tagself.20 的不必要扩展,而不是未定义的属性 origin,请参阅我的 cmets 问题。
  • @MartinR - 是的,我同意。如果有的话,在我发布我的答案之后对问题所做的编辑说明了这种本地范围宏的危险。
最近更新 更多