Differenze tra le versioni di "C/Compilatore e precompilatore/Direttive"

Jump to navigation Jump to search
==={{IndexItem|direttive #if, #else, #elif ed #endif}}<tt>#if, #else, #elif ed #endif</tt>===
 
Queste direttive servono per la {{IndexItem|compilazione condizionale}}''compilazione condizionale''. Il loro uso è del tutto analogo a quello dell'[[Linguaggio_C/Blocchi_e_funzioni/Blocchi_if_e_switch|istruzione <tt>if</tt>]], ma con una sostanziale differenza: mentre in una normale istruzione <tt>if</tt> la condizione viene valutata a tempo di esecuzione per decidere quale gruppo di istruzioni eseguire, la direttiva #if seleziona a tempo di compilazione quale gruppo di istruzioni debba essere compilato, mentre le istruzioni scartate vengono completamente rimosse e, ai fini del codice eseguibile prodotto, è come non fossero esistite.
Queste direttive servono per la {{IndexItem|compilazione condizionale}}''compilazione condizionale''.
 
Come conseguenza immediata, le espressioni lecite in una direttiva #if sono solo ed esclusivamente quelle valutabili interamente a tempo di compilazione.
 
Una forma particolare di direttiva #if è la #ifdef e la sua corrispondente negata #ifndef, che restituiscono un valore di verità rispettivamente vero e falso se la macro fornita come parametro è stata precedentemente definita.
 
Esempio:
#define EXPR(a) (a)==6 ? 6 : 0
 
#ifdef NUM // vera: NUM è stato precedentemente definito
#ifdef NUM
#if NUM==10 // vera
printf("NUM è uguale a 10.\n");
#if EXPR(6) // vera: per un valore pari a 6 del parametro, l'espressione restituisce 6
#if EXPR(6)
printf("EXPR ha dato un risultato! %d\n", EXPR(6));
#else
printf("EXPR non ha dato alcun risultato!\n");
#endif
#elif NUM<10 // falsa
printf("NUM è minore di 10: %d\n", NUM);
#else
#endif
#else
printf("NUM non è definito.\n", NUM);
#endif
return 0;
}
</pre>
 
Tale codice, una volta elaborato dal preprocessore, è equivalente al seguente:
<pre>
/*... trascrizione completa dei file stdio.h e stdlib.h...*/
 
int main(void)
{
printf("NUM è uguale a 10.\n");
printf("EXPR ha dato un risultato! %d\n", (6)==6 ? 6 : 0);
return 0;
}
</pre>
 
Si noti che il preprocessore sostituisce ogni occorrenza delle macro con il loro testo equivalente.
 
==={{IndexItem|direttive #include}}<tt>#include</tt>===
8

contributi

Menu di navigazione