2011-01-14 10 views
0
#ifdef doesn't work. But why? 

CGFloat maxScale; 

if ([[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES) 
{ 
    NSLog (@"case1"); 
#define GLOBAL1 
} 
else 
{ 
    NSLog (@"case2"); 
#undef GLOBAL1 
} 

#ifdef GLOBAL1 
NSLog (@"first"); 
maxScale = 1.0/[[UIScreen mainScreen] scale]; 
#else 
NSLog (@"second"); 
maxScale = 1.0; 
#endif 

#undef GLOBAL1 

私のログ:case1、second。しかし、まずケース1でなければならない。#ifdefは機能しません。しかし、なぜ?

+0

あなたの書式を修正したいかもしれません。読みやすくなります。 – James

+1

コードを正しく投稿してください。それは判読不能です。 – taskinoor

答えて

4

#define,#ifdefは、プリプロセッサのマクロ/条件です。これは、コードがコンパイルされる前にの前に、それらに含まれるロジックがにコンパイルされていることを意味します。実際にはコードの一部ではありません。

See this guide for learning what pre-processor macros/conditionals are and do.


[EDIT]

これはあなたのコードを読み取るときに、プリプロセッサが見ているものです。それ

#define GLOBAL1 
#undef GLOBAL1 

#ifdef GLOBAL1 
    //... 
#else 
    //... 
#endif 

#undef GLOBAL1 

他のすべてのコードとロジックを無視します。

これは、コンパイラは、実際のコードを出力しますされています

if ([[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES) 
{ 
    NSLog (@"case1"); 
} 
else 
{ 
    NSLog (@"case2"); 
} 

// because the pre-processor #undef GLOBAL1 
NSLog (@"second"); 
maxScale = 1.0; 

プリプロセッサのコードは、コンパイラどのようにコンパイルを伝える「実行」され、そして使用または実行中に実行されないます-時間。

希望に役立ちます!

1

プリプロセッサは#defineがコード化されたif文の内部にあることに気付かず、コードの前で処理され、他のプリプロセッサ定義のみを扱います。 #definesとその他のプリプロセッサーコマンド(#undefなど)をコードとして使用することはできません。コードが条件分岐に入るたびにヒットすることはありません。

関連する問題