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 ...ます。(その引数は、へのuserData引数を介して渡されcreateBodyます。)

このコードは決して単純ではありませんが、他のすべてが機能しているので、答えが存在する必要があると思います。

これが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 に答える