Funzionalità Avanzate
Il pre-processore offre funzionalità avanzate che ti permettono di compiere autentiche operazioni meta-programmatiche.
Stringizing (#)
Section titled “Stringizing (#)”Nelle definizioni di function-like macro, se metti un cancelletto # davanti a un parametro, il pre-processore racchiuderà quell’argomento testualmente tra doppie virgolette, trasformandolo in una stringa C!
#define STAMPA_NOME(var) printf("La variabile " #var " vale: %d", var)
int punteggio = 10;STAMPA_NOME(punteggio);// Diventa: printf("La variabile " "punteggio" " vale: %d", punteggio);Token Pasting (##)
Section titled “Token Pasting (##)”La sequenza ## (chiamata “incolla-token”) unisce letteralmente due parti di testo per generare un nuovo nome di variabile, funzione o token in modo dinamico a tempo di compilazione.
#define CREA_VARIABILE(nome, id) int nome ## _ ## id = 0;
CREA_VARIABILE(player, 1) // Diventa testualmente: int player_1 = 0;Type-Generic Macros (_Generic)
Section titled “Type-Generic Macros (_Generic)”Il C, a differenza del C++, non supporta nativamente il Function Overloading (ovvero la capacità di dichiarare più versioni della funzione stampa() a seconda se riceve int o float). Nel 2011 (Standard C11), è stata introdotta la keyword _Generic che, abbinata alle macro, permette di aggirare questa limitazione, reindirizzando la chiamata alla funzione corretta a seconda del tipo della variabile passata!
#define stampa(X) _Generic((X), \ int: stampa_intero, \ float: stampa_float, \ char*: stampa_stringa \)(X)Macro Predefinite dal Compilatore
Section titled “Macro Predefinite dal Compilatore”Per facilitare la scrittura di log diagnostici e report di errori automatici, tutti i compilatori C conformi allo standard iniettano delle speciali macro predefinite. Non richiedono alcun #include.
__FILE__: Si espande in una stringa con il nome o il percorso del file corrente.__LINE__: Si espande in un intero indicante il numero di riga corrente nel codice.__DATE__/__TIME__: Si espandono nella data e ora in cui è stata avviata la compilazione di quel file (in formato stringa).__STDC__: Si espande a1per segnalare che il compilatore rispetta appieno lo standard C.
💻 Esercizio Pratico
Section titled “💻 Esercizio Pratico”Sperimentiamo con le macro predefinite! Stampa a schermo la linea esatta su cui si trova l’istruzione printf e il nome del file.