# C/Compilatore e precompilatore/Direttive

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario
Il precompilatore può eseguire diverse istruzioni.

## Le direttive

Le direttive sono delle istruzioni al precompilatore e dipendono dal compilatore stesso, per cui è consigliabile consultarne la documentazione.
Le direttive non finiscono con il punto e virgola ma con la fin di riga.
Ecco le direttive:

### #define

La direttiva #define serve per definire macro. Sintassi:
Il testo può essere una costante o un'espressione, anche parametrizzata:
Abbiamo trattato l'operatore ? qui.

### #if, #else, #elif ed #endif

Queste direttive servono per la compilazione condizionale. Il loro uso è del tutto analogo a quello dell'istruzione if, ma con una sostanziale differenza: mentre in una normale istruzione if 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.
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:
Tale codice, una volta elaborato dal preprocessore, è equivalente al seguente:
Si noti che il preprocessore sostituisce ogni occorrenza delle macro con il loro testo equivalente.

### #include

La direttiva #include è molto importante: permette di includere un file C in un altro. La sua sintassi è la seguente:
Qual è la differenza fra parentesi angolari e virgolette? Dipende dal compilatore, ma solitamente con le parentesi angolari il linker cerca nelle directory della libreria standard, mentre con le virgolette si cerca il file prima all'interno della directory corrente e poi all'interno delle directory della libreria standard.

### #line

La direttiva #line permette di alterare il contenuto delle macro __LINE__ e __FILE__. Essa non salta ad un altro punto del programma; modifica semplicemente queste macro.
La sintassi è:
Esempio:
Il file è opzionale.

### #pragma

La direttiva #pragma serve per inviare particolari istruzioni al compilatore. Le opzioni disponibili variano da compilatore a compilatore, per cui è consigliabile consultarne la documentazione.

### #undef

La direttiva #undef serve per cancellare delle macro definite in precedenza con #define. Sintassi:
Esempio:

## Operatori

Il preprocessore accetta anche degli speciali operatori:

### L'operatore #

Questo operatore serve per trasformare una sequenza di caratteri in stringa all'interno di una macro.
Esempio:

### L'operatore ##

Questo operatore si chiama operatore di concatenamento. Esempio:
Questo programma stamperà il numero 10.

### L'operatore defined

Questo operatore restituisce vero se la macro che lo segue è definita.
È utile quando si vogliono usare gli operatori logici o per rimediare alla mancanza di una direttiva #elifdef

## Le macro

Il linguaggio C definisce anche delle macro:

### __DATE__

La macro __DATE__ contiene la data della compilazione nel formato mese/giorno/anno.

### __FILE__

La macro __FILE__ contiene il nome del file correntemente in compilazione. Può essere modificata con la direttiva #line.

### __LINE__

La macro __LINE__ contiene il numero della linea correntemente in compilazione. Può essere modificata con la direttiva #line.

### __TIME__

La macro __TIME__ contiene l'ora della compilazione nel formato ore:minuti:secondi.

### __STDC__

Il contenuto della macro __STDC__ varia da compilatore a compilatore. Solitamente, se essa è definita, il compilatore accetterà soltanto codice C standard.