0

#define次の if ステートメントで使用すると、次のマクロが期待どおりに評価されない理由について混乱しています。

#define kOffsetX  2048.0
#define kPositionX (screenSize.width * (kOffsetX/2048.0))-10.0

CGSize screenSize = [CCDirector sharedDirector].winSize;
float potentialPosition = 486.86f;
float playersFieldOffset = 1.0;

if ((potentialPosition - kPositionX) * playersFieldOffset > 0.0) {

kPositionX は 470.0 に評価されることに注意してください。明らかに 486-470 が 0 より大きい場合、if ステートメントは FALSE と評価されます。ただし、kPositionX を括弧で囲むと、if ステートメントは適切に TRUE と評価されます。

なぜこうなった?これは a の不適切な使用方法#defineですか? もしそうなら、私は何をすべきですか?

4

4 に答える 4

4

プリプロセッサはすべてのマクロをその定義に置き換えるだけなので、

potentialPosition - kPositionX

に展開されます

potentialPosition - (screenSize.width * (2048.0/2048.0))-10.0

実行時に評価されると、

486.86 - 480 - 10  = -3.14 < 0

マクロ内の式は常に括弧で囲む必要があります。

#define kPositionX ((screenSize.width * (kOffsetX/2048.0))-10.0)

展開が与えるように

potentialPosition - ((screenSize.width * (2048.0/2048.0))-10.0)

これはあなたが期待するものです。

これは、プリプロセッサ マクロの欠点 (の 1 つ) です。または、たとえば (インライン) 関数を使用することもできます。詳細については、 インライン関数とプリプロセッサ マクロ を参照してください。

于 2013-10-29T18:32:29.507 に答える
1

#defineマクロはリテラル式です! 引数が結合された後 (そして、このマクロに引数を使用していない場合)、マクロは基本的にコードに直接挿入されます。だから、あなたが期待している間、

if ((potentialPosition - kPositionX) * playersFieldOffset > 0.0)

に変わる

if ((potentialPosition - (answer of kPositionX) * playersFieldOffset > 0.0)

それは実際に

if ((potentialPosition - (screenSize.width * (kOffsetX/2048.0)) - 10.0) * playersFieldOffset > 0.0)

これは正しく評価されません。マクロ全体を括弧で囲むことで、これを解決できます。

#define kPositionX ((screenSize.width * (kOffsetX/2048.0)) - 10.0)

または、あなたが言ったように、kPositionXを括弧で囲みます

if ((potentialPosition - (kPositionX)) * playersFieldOffset > 0.0) {

また、一般的なルールとして、マクロは通常すべて大文字で記述し、アンダースコア (_) は単語間の区切りを示します。#MACRO_NUMBER_ONE を定義

于 2013-10-29T18:36:47.303 に答える
1

#define を使用するときは常に、#define の内容全体を括弧で囲むようにしてください。これにより、誤った演算順序の計算が発生するのを防ぐことができます。#define を次のように変更します。

#define kOffsetX  (2048.0)
#define kPositionX ((screenSize.width * (kOffsetX/2048.0))-10.0)
于 2013-10-29T18:35:20.163 に答える
1

マクロは文字列置換によって機能します。マクロkPositionX(a) - bの形式であるため、部分式で使用すると(potentialPosition - kPositionX)、結果は次のようになります。

(potentialPosition - (screenSize.width * (kOffsetX/2048.0)) - 10.0)

から差し引か10.0ます。おそらくあなたが望んでいた:potentialPosition

(potentialPosition - ((screenSize.width * (kOffsetX/2048.0)) - 10.0))

10.0追加された余分な括弧 - に注意してくださいpotentialPosition

マクロは定義時に文字列置換を使用することを常に覚えておく必要があります。式を含むマクロには、問題を回避するために外側の括弧を付ける必要があります。

#define kPositionX ((screenSize.width * (kOffsetX/2048.0)) - 10.0)
于 2013-10-29T18:38:59.593 に答える