2013-05-08 24 views
19

Ho appreso che if o #if possono essere utilizzati entrambi per i controlli delle condizioni. Come possiamo verificare le condizioni usando if, perché dovremmo usare il preprocessore #if?"if" e "#if"; quale è meglio usare

Che differenza farà al mio codice se utilizzo #if anziché if?

Quale è meglio usare e perché?

+4

Ricerca "preprocessore". –

+11

Non capisco i -1. Anche se totalmente noobish, questa è una domanda abbastanza valida. E non così facilmente googlable se non si conosce la parola chiave "preprocessore". – Dariusz

+12

Non capisco i voti "vicini come non costruttivi": questa è una domanda alquanto semplice ma completamente legittima. – dasblinkenlight

risposta

28

if e #if sono cose diverse con scopi diversi.

Se si utilizza l'istruzione if, la condizione viene valutata in fase di esecuzione e il codice per entrambi i rami esiste all'interno del programma compilato. La condizione può essere basata su informazioni di runtime, come lo stato di una variabile. if è per il controllo di flusso standard in un programma.

Se si utilizza il #if preprocessore, la condizione viene valutata al momento della compilazione, e il codice per il ramo falso è non incluso nel programma compilato. La condizione può essere basata solo su informazioni in fase di compilazione (come le costanti #define e simili). #if è per avere codice diverso per diversi ambienti in fase di compilazione (ad esempio, codice diverso per la compilazione su Windows vs * nix, quel genere di cose).

+0

Spiegazione semplice e pulita. Grazie – kalmanIsAGameChanger

12

non abbiamo potuto dire che meglio usare, perché uno viene utilizzato in fase di compilazione (#if) e l'altro viene utilizzato nella fase di runtime (if)

#if 1 
    printf("this code will be built\n"); 
#else 
    printf("this code will not\n"); 
#endif 

cerchiamo di costruire il codice di cui sopra con gcc -E e vedrete che il compilatore genera un altro codice che contiene solo:

printf("this code will be build\n"); 

l'altro printf non sarà presente nel nuovo codice (codice del processore pre) e quindi non presente nel binario programma.

Conclusione: il #if viene trattato in fase di compilazione, ma il normale if viene trattato quando il programma eseguito

È possibile utilizzare la #if 0 in una parte del codice inorder per evitare il compilatore per compilarlo. è come avete commentato questa parte

esempio

int main(void) { 

     printf("this code will be build\n"); 
#if 0 
     printf("this code will not\n"); 
#endif 

} 

è equivalente a

int main(void) { 

     printf("this code will be built\n"); 
/* 
     printf("this code will not\n"); 
*/ 

} 
+0

"uno viene utilizzato nella fase di compilazione (#if) e l'altro viene utilizzato nella fase di compilazione (if)";) –

+0

@MichalB. è un errore di battitura :) – MOHAMED

3

È necessario utilizzare #if quando il risultato della condizione è noto in fase di compilazione e regolare se il risultato non è noto fino al runtime.

#if DEBUG 

lo so al momento della compilazione sto facendo una build di debug

if (date == DateTime.Today) 

Dipende che giorno è

6

Hey entrambi sono diversi

  1. #if I test se la condizione è vero al momento della compilazione.
  2. if viene valutato in fase di esecuzione.
1

Alcuni usi di #if sono:

  • si vuole mettere stampe extra, o assegni quando si genera una versione di debug del codice
  • Si vuole garantire il compilatore non include un .h file due volte
  • si desidera scrivere codice che utilizzerà chiamate di sistema diverse e, a seconda del sistema, viene compilato in modo da utilizzare quelle appropriate.

Poiché tutto quanto sopra sono controllati in fase di compilazione ciò significa che:

  • La condizione deve poter essere valutati compiletime
  • Il codice prodotto non conterrà i rami che restituiscono false, che porta a un codice più piccolo e più veloce, poiché la condizione non viene verificata ogni volta che viene eseguito il programma.

Esempi:

Aggiunta di controlli aggiuntivi solo per la modalità di debug:

#define DEBUGLEVEL 2 

#if DEBUGLEVEL > 1 
    printf("The value of x is: %d", x); 
#end if 

#if DEBUGLEVEL > 2 
    printf("The address of x is: %x", &x); 
    ASSERT(x > 100); 
#end if 

Garantire solo intestazione viene incluso una volta:

#ifndef PERSON_H 
#define PERSON_H 
    class Person{ 
     .... 
    }; 
#end if 

Avere codice diverso a seconda della piattaforma:

#ifdef WINDOWS 
    time = QueryPerformanceCounter(..); 
#else 
    time = gettimeofday(..); 
#endif