2011-10-07 9 views
18

Sono un po 'confuso dalla sintassi "pound if" o #if che vedo quando guardo alcune classi.Sintassi Objective C "#if"

Ad esempio:

#if someConstant == someNumber 
    do something 
#elif 
    etc 

versus:

if (someConstant == someNumber) 
    do something 
else if { 
    do more stuff 
} 

qual è la differenza, e perché usare #if?

risposta

28

#if ecc. Sono direttive del preprocessore. Ciò significa che vengono gestiti prima della compilazione e non in fase di runtime. Questo può essere utile, ad esempio, nel definire il comportamento di debug che compila solamente quando si genera per debug e non release:

#if DEBUG 
    #define ISRelease(x) [x release] 
#else 
    #define ISRelease(x) [x release], x = nil 
#endif 

(Codice per gentile concessione di blog di Jeff LaMarche.)

In questo modo non fate è necessario esaminare l'intero codice dell'applicazione prima di inviare l'app e rimuovere un carico di codice di debug. Questo è solo un piccolo esempio dell'uso di queste direttive.

+0

#if è lo stesso di #ifdef ?? –

+0

No - se si è sostituito con '# if' sopra con' # ifdef' ("se definito"), il condizionale ha esito positivo solo se 'DEBUG' è già definito. Esiste anche una direttiva preprocessore '# ifndef' che restituisce il risultato opposto (" se non definito "). – Stuart

10

#if è una direttiva preprocessore.

if è un linguaggio costruttivo.

La differenza sta nel modo in cui viene compilato il programma finale. Quando si utilizza #if, il risultato di tale direttiva è ciò che il programma finale conterrà su quelle linee. Quando si utilizza il costrutto del linguaggio, l'espressione passata al costrutto verrà valutata al runtime e non in fase di compilazione.

0

Le risposte precedenti coprono #if utilizzi dal debug alla terminologia e manca un altro uso comune: #if viene utilizzato per commentare grossi pezzi di codice. Questo è utile quando i programmatori devono liberarsi di qualcosa che già contiene commenti.

#if 0 
    a lof of C code with /* style */ comments included 
#endif 

Lo uso molto. Vantaggio rispetto a qualsiasi altro #if e stile di commento: in realtà non interessa la maggior parte della sintassi interrotta al suo interno.