我正在尝试使用#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: ^
现在我的观点是,一切都运作良好,没有任何错误,除了一个让我感到害怕的错误:
如上所示,预期的不合格身份
指向((__bridge ...
中的第一个括号。 (该参数通过userData
参数传递给createBody
。)
我知道这段代码不是那么简单,但由于其他一切正常,我相信答案必定存在。
这是我关于SO的第一个问题,所以如果有任何不清楚或不足之处,请告诉我!
答案 0 :(得分:1)
我正在尝试使用#define语句来简化我的代码。
这在我的脑海里听起来很震惊。
将其分解为功能。你说你做不到。我说你可以。
请注意您的宏:
createBody(name,type,xpos,ypos,userData,width,height);
完全与C函数的语法相同。所以你已经创建了一个函数,你只将它声明为一个宏。没有理由不能将它重写为函数(C或Objective-C无关紧要)。你不需要为每个身体赋予自己的名字,而是可以将它们存储在字典中(但要小心,因为Box2D取得了身体的所有权)。