2011-01-19 7 views
2

動作しない、私はそれを要約すると、私の.hファイルにはなぜ2つの#のdefine'dマクロを加減算すると、iPhone/Objective-Cの上で私のiPhoneアプリで

#define ORIENTATION_IS_PORTRAIT UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) 
#define FULLSCREEN_MODE   ORIENTATION_IS_PORTRAIT?460:300 
#define AD_HEIGHT    ORIENTATION_IS_PORTRAIT?50:32 
#define FULLSCREEN_MODE_WITH_AD FULLSCREEN_MODE - AD_HEIGHT //doesn't work 

これを持って、私が持っていますマクロを使用して方向を検出します。 UIWebViewがフルスクリーンモード(ボタンを押すことによって起動)になっているとき、私は別のものを持っています。私は広告を一番下に置いておく必要があります。ただし、UIWebViewの高さから広告の高さを差し引くと、AD_HEIGHTが返されます。

追加の場合、(FULLSCREEN_MODE + AD_HEIGHT)はFULLSCREEN_MODEのみを返します。

また、定数を使用する場合は、正確にどこに置きますか。私は検索し、「.mファイル」のような答えしか見つけられませんでしたが、どこに??

+0

「動作しない」とはどういう意味ですか?エラーメッセージを投稿してください。 –

答えて

4

は何が欲しいのは、このようにそれを持っていることです。

#define FULLSCREEN_MODE   (ORIENTATION_IS_PORTRAIT?460:300) 
#define AD_HEIGHT    (ORIENTATION_IS_PORTRAIT?50:32) 
#define FULLSCREEN_MODE_WITH_AD (FULLSCREEN_MODE - AD_HEIGHT) 

は、より複雑な式の場合、私はあなたがdo { ... } while(0)でそれを包むだけではなく、それらを一緒にグループ化することをお勧めしたいです。あなたが望むの数学ではありません

UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? 460 : 300 - UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? 50 : 32 

:ここで何が起こっている

は、それがとして解析されています。

+0

あなたはここで急いでいなければなりません。 –

+0

あなたは絶対天才です! ;) – zsniperx

2

すべてのマクロを囲んで()で囲んでください。これは良い習慣であり、予期せぬ動作を緩和します。

例:

#define FULLSCREEN_MODE   (ORIENTATION_IS_PORTRAIT?460:300) 

プリプロセッサは、別のテキストの一片の直接交換を行います。操作の問題の順序がある場合は、かっこで節約できます。

0

マクロを避けてください。関数を定義します。それらを宣言することができますinline

+0

'inline'は、コンパイラが必要としない可能性のあるヒントに過ぎず無視します。もちろん、YMMVは別のコンパイラになるときです。 GCCには常にインラインに拡張するインライン展開がありますが、それ以外の場合はgccはインライン展開のヒントをほとんど無視します。 – jer

1

代わりに、プリプロセッサを避けて混乱させ、インライン関数を使用してください。

inline BOOL orientationIsPortait() { 
    return UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]); 
} 


inline int fullscreenMode() { 
    return orientationIsPortait() ? 460 : 300; 
} 

...など

これらは、あなたの@implementationブロックの外に行くだろう。

私はあなたがこれらの機能を実行するのではなく、偉大な時に1回実行すると思いますので、マクロやインライン化のような最適化について考えるのは時期尚早です。

+0

これは面白そうですね!私は[self orientationIsPortrait]に電話する必要がありますか? – zsniperx

+0

いいえ、それはインスタンスメソッドではなく、Cの関数です。メソッドとしてではなく、Cで関数を実装する時期を知ることは有用です。データを保持しないツールが必要な場合もあります。 –

関連する問題