【问题标题】:"Expected unqualified-id" in #define statement#define 语句中的“预期不合格 ID”
【发布时间】: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


【解决方案1】:

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

这在我心中敲响了警钟。

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

请注意这里的宏:

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

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

【讨论】:

  • 我将如何创建这样的字典? Alloc-init 一个 NSDictionary 并添加带有我当前变量名称的键,以及作为值的主体(和固定装置,该方法也适用于该方法)?那么我会遇到所有权或类似类型的问题吗?
  • 顺便说一句,有人知道那个愚蠢的错误是什么意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2021-01-24
相关资源
最近更新 更多