2011-01-14 2 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 

мой журнал: кейс1, второй. Но сначала это должно быть case1.#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) в качестве кода - они не будут ударяться каждый раз, когда код войдет в условные ветви.

Смежные вопросы