2013-03-24 56 views
0

下面的宏给我一个解析错误。不能看到这里有什么错。目标c宏不工作

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

    .... 

adjust(20, 28, 265) 

编辑:

非常感谢您的帮助迄今。看附件截图。我想使用宏扩展来提高代码的可读性。它是一种非常本地使用,因此无风险或重用等

enter image description here

+0

是源自结构?或者这是Rect的一部分? – 2013-03-24 08:08:08

+0

什么是错误? – 2013-03-24 08:08:47

+1

问题是'if(self.tag == tag)'展开为'if(self.20 == 20)',比较重复问题以获得可能的解决方案。 – 2013-03-24 09:05:21

回答

2

您的宏引用了未定义的属性origin,这如果不更换的范围存在,会导致编译器错误在宏观扩大之后。实际上,总体来说,你的宏不是很模块化的。例如,你必须tagself引用,这是属性,这些属性

  1. 将是非常上下文
  2. 会导致如果不发生,并有特定的含义,他们编译失败宏扩展已经完成
+0

+1喜欢的解释 – 2013-03-24 08:18:28

+1

我同意宏不是模块化的。然而,编译器错误的实际原因是'self.tag'到'self.20'的不必要的扩展,而不是未定义的属性'origin',请参阅我对该问题的评论。 – 2013-03-24 10:16:59

+0

@MartinR - 是的,我同意。如果有的话,在我发布我的答案之后对***问题进行的编辑说明了这种本地范围的宏的危险。 – Perception 2013-03-24 10:35:43