Inclusione Condizionale e Guardie
Il pre-processore permette di nascondere o mostrare parti di codice al compilatore usando l’inclusione condizionale. Questo è fondamentale per scrivere codice multipiattaforma (es. codice che usa le API di Windows su Windows e le API POSIX su Linux) all’interno dello stesso file!
Le Direttive #if, #elif ed #else
Section titled “Le Direttive #if, #elif ed #else”Funzionano in modo analogo alle normali istruzioni if del C, ma vengono valutate a tempo di pre-processing. Controllano costanti intere o definizioni di macro, e l’intero blocco si chiude con #endif.
#if defined(_WIN32) // Questo codice verrà incollato solo se stiamo compilando su Windows #include <Windows.h>#elif defined(__ANDROID__) // Questo codice verrà incollato solo su Android #include <android/log.h>#else // Se non è né Windows né Android, compiliamo questa versione! #include <unistd.h>#endif#error: Generare Errori Volontari
Section titled “#error: Generare Errori Volontari”Se il codice sta per essere compilato su una piattaforma non supportata o mancano delle condizioni critiche di configurazione, possiamo (e dovremmo) far fallire la compilazione intenzionalmente:
#ifndef _WIN32 #error "Questo programma funziona solo su sistemi Microsoft Windows!"#endifGli Header Guards
Section titled “Gli Header Guards”In progetti complessi, un file .c potrebbe includere A.h e B.h, e a sua volta A.h potrebbe includere B.h. Il pre-processore finirebbe per incollare due volte il contenuto di B.h nel file .c, causando errori di ridefinizione di tipi e simboli.
Per evitare l’inclusione multipla, si usa un design pattern storico chiamato Header Guard (Guardia di Header).
Avvolgi tutto il contenuto dei tuoi file .h in questo modo:
#ifndef MY_MATH_H // 1. Se MY_MATH_H non è definito...#define MY_MATH_H // 2. Definiscilo subito!
// 3. Qui metti il contenuto del tuo header (dichiarazioni, struct, ecc.)int somma(int a, int b);
#endif // 4. Fine dell'inclusione condizionaleCosa succede? La prima volta che il file viene incluso, la guardia scatta, la macro viene definita e il codice passa. Se il file viene incluso di nuovo, #ifndef MY_MATH_H risulterà falso, e il pre-processore ignorerà tutto fino all’#endif!
💻 Esercizio Pratico (Inclusione Condizionale)
Section titled “💻 Esercizio Pratico (Inclusione Condizionale)”Vogliamo creare un programma che si comporta diversamente a seconda che sia in modalità “DEBUG” o no. Usa #ifdef per stampare un messaggio extra.