#define语句中的“期望的nonqualified-id”

时间:2012-12-30 09:33:14

标签: objective-c xcode cocos2d-iphone c-preprocessor

我正在尝试使用#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的第一个问题,所以如果有任何不清楚或不足之处,请告诉我!

1 个答案:

答案 0 :(得分:1)

  

我正在尝试使用#define语句来简化我的代码。

这在我的脑海里听起来很震惊。

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

请注意您的宏:

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

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