2012-05-28 9 views
5

#ifおよび#​​defineステートメントの多くの定義を読んでいます。
私は以下のコメントとして、それを定義する行の「プリプロセッサ式の開始時に無効なトークンを」だけエラーで、私が読ん方法を使用しようとしました:それはで動作するのはなぜ#defineまたは#ifステートメントエラー

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

#define is_ipad   (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#define is_ipad_hd  ((is_ipad == 1 && [UIScreen mainScreen].bounds.size.width > 1024) ? YES : NO) 
#define is_iphone_hd ([UIScreen mainScreen].bounds.size.width > 480 ? YES : NO) 
#define device_width 480.0f 
#define device_height 320.0f 

#if (is_ipad_hd == YES) // Error here 
    #define device_width  = 2048.0f 
    #define device_height  = 1496.0f 
#endif 

シンプルなチュートリアルで、もっと複雑なものを試してみると、これらのことが起こります!

+4

プリプロセッサディレクティブはコンパイル前に評価されます。ランタイム情報を操作することはできません。 (私はObjective Cを知らないが、 '[UIScreen mainScreen] .bounds.size.width'は実行時のように聞こえる...) –

+0

これでわかりました。 どうすればデバイスの画面サイズを指定できますか? 私の遅さは申し訳ありません。英語の一部の研究手法は翻訳が難しく、それがすべきだと思うように見えるためです。 –

答えて

4

これらはプリプロセッサディレクティブなので、[UIScreen mainScreen]メソッドやコンパイル時に定義された他のすべてのオブジェクトにはアクセスできません!

1

マクロ評価はコンパイル時に行われます。

ただし、(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)または[UIScreen mainScreen]は、実行時にのみ解釈できます。

それを超えると、汚い仕事をするために画面サイズに頼るべきではありません。迅速なグーグルはこれで戻ってきた私もCプリプロセッサに精通していないんだけれども

BOOL isiPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; 
BOOL isHD = [[UIScreen mainScreen] scale] == 2.0; 

if (isiPad) { 
    if (isHD) { 
    // retina iPad 
    } else { 
    // non-retina iPad 
    } 
} else { 
    if (isHD) { 
    // retina iPhone/iPod touch 
    } else { 
    // non-retina iPhone/iPod touch 
    } 
} 
+0

だから私はそれを一度設定したいので、#defineと#ifを使いたいと思っていました。 私はあなたの例として単純なヘッダーを使用することが実現可能かどうか、すべてのシーンで処理するかどうかはわかりません。 これが正しい場合は、私が話していることです。 ありがとうございました –

+0

私はあなたの提案に従いましたが、常に変数をチェックして設定するのは間違っていませんか? もっと簡単な方法がありますか? –

0

ここで他の人と同意:あなたの代わりに、ユーザインターフェースイディオムに頼るべきであると、メイン画面のスケールは

expressionは、整数型のC式です。厳密な制限があります。 .... 私はここですぐに達成するよりもはるかに優れた書式設定source.