Skip to content

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!

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.

foo.c
#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

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!"
#endif

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:

my_math.h
#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 condizionale

Cosa 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.