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

mon journal: case1, deuxième. Mais il doit être cas1, d'abord.#ifdef ne fonctionne pas. Mais pourquoi?

+0

Peut-être souhaitez-vous corriger votre mise en forme. Cela rendra la lecture plus facile. – James

+1

Postez le code correctement. C'est illisible. – taskinoor

Répondre

4

#define, #ifdef sont des macros/conditions préalables du processeur. Cela signifie que la logique contenue dans eux est compilée avant votre code est compilé. Cela ne fait pas partie de votre code.

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


[EDIT]

C'est ce que votre pré-processeur voit quand il lit votre code.

#define GLOBAL1 
#undef GLOBAL1 

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

#undef GLOBAL1 

il tous les autres ne tient pas compte du code et de la logique.

Ceci est la sortie de code réel du compilateur fait:

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

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

Le code pré-processeur est « exécuté » indiquant le compilateur comment compiler, et ne utiliser ou exécuter pendant l'exécution -temps.

Espérons que ça aide!

1

Le préprocesseur ne se soucie pas que le #define soit dans une instruction if codée - il est traité avant le code et se soucie uniquement des autres définitions de préprocesseur. Vous ne pouvez pas utiliser #defines et d'autres commandes de préprocesseur (telles que #undef) comme code - elles ne seront pas frappées chaque fois que le code entre dans les branches conditionnelles.

Questions connexes