【发布时间】:2012-12-30 09:33:13
【问题描述】:
我正在尝试使用#define 语句来简化我的代码。这是因为它包含大量重复的代码“块”,这些代码不能使用明显的替代方法来重复,函数,因为在这些块中,需要像在 #define 语句中那样声明变量,例如#define dostuff(name) int name##Variable;.
代码
#define createBody(name,type,xpos,ypos,userData,width,height) b2BodyDef name##BodyDef;\
name##BodyDef.type = type==@"dynamic"?b2_dynamicBody:b2_staticBody;\
name##BodyDef.position.Set(xpos,ypos);\
name##BodyDef.userData = userData;\
name=world->CreateBody(&name##BodyDef);\
b2PolygonShape name##shape;\
name##shape.SetAsBox(width/ptm_ratio/2,height/ptm_ratio/2);
...并将其应用于以下内容:
createBody(block, @"dynamic", winSize.width*5/6/ptm_ratio, winSize.height*1/6/ptm_ratio, ((__bridge void*)blockspr), blockspr.contentSize.width, blockspr.contentSize.height)
// error appears there: ^
现在我的意思是,一切都很好,没有错误,除了一个让我害怕的错误:
预期的不合格 ID
它指向((__bridge ... 中的第一个括号,如图所示。 (该参数通过userData 参数传递给createBody。)
我知道这段代码远非简单,但由于其他一切正常,我相信答案一定存在。
这是我关于SO的第一个问题,如果有什么不清楚或不充分的地方,请告诉我!
【问题讨论】:
-
Objective-C 是否隐藏在所有这些东西之下?
-
哈哈它是:) 我会编辑标签
-
感谢您更新标签。老实说,看起来您正在尝试解决错误的问题。你应该把精力花在尝试重新设计你的代码上,这样你就不需要所有那些生成的变量名,而不是试图修复那些宏。
-
关键是代码块需要一个接一个地重复很多次(我说的是 10 到 15 次)。当然,我可以只是重复这些块而不介意,但我想知道是否有更简洁的方法来做同样的食谱烦人的重复。
-
重复是问题的根源。但是将这种重复隐藏在宏中并不是一个好的解决方案。您需要弄清楚如何更改代码以使其在适当的功能中可行。除了生成的名称以及您可以通过将引用或指针传递给函数来取消的名称之外,我在您的宏中没有看到任何可以防止这种情况发生的东西。
标签: objective-c xcode cocos2d-iphone c-preprocessor