0

我试图通过使用#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 ...。(该参数通过参数传递userDatacreateBody。)

我知道这段代码远非简单,但由于其他一切正常,我相信必须存在答案。

这是我关于SO的第一个问题,所以如果有任何不清楚或不足的地方,请告诉我!

4

1 回答 1

1

我试图通过使用#define 语句来简化我的代码。

这在我心里敲响了警钟。

将其分解为功能。你说你不能。我说你可以。

请注意,您的宏在这里:

createBody(name,type,xpos,ypos,userData,width,height);

它的语法与 C 函数完全相同。所以你已经创建了一个函数,你只是将它声明为一个宏。没有理由不能将它重写为函数(C 或 Objective-C 无关紧要)。您不需要为每个主体指定自己的名称,而是可以将它们存储在字典中(但要小心,因为 Box2D 拥有主体的所有权)。

于 2012-12-30T15:36:37.267 回答