Concetti Chiave
- Le funzioni variadiche in C permettono di utilizzare un numero variabile di argomenti, richiedendo però l'uso di macro e della libreria stdarg.h.
- Ogni funzione variadica deve avere almeno un argomento fisso, seguito da elissi (...) per indicare argomenti opzionali.
- Il programmatore deve stabilire convenzioni per determinare il numero e il tipo di argomenti, usando metodi come argomenti sentinella o pattern fissi.
- Le macro stdarg.h come va_start, va_arg e va_end sono essenziali per gestire l'accesso agli argomenti opzionali nelle funzioni variadiche.
- Il comportamento degli argomenti opzionali è soggetto a promozioni di tipo predefinite, complicando l'uso di diversi tipi di dati.
Funzioni variadiche
Funzioni variadiche = funzioni con un numero variabile di argomenti. Lo standard di C ha una sintassi specifica per la dichiarazione di queste funzioni, ma non ha alcuna sintassi apposita per la loro definizione, è quindi necessario usare macro e funzioni della libreria stdarg.h.
I prototipi delle funzioni variadiche usano le elissi:
In ogni funzione variadica c’è almeno un elemento fisso, il primo, ma possono essercene anche di più, ma l’elissi rimane comunque l’ultimo argomento.
In C non è possibile determinare il numero e il tipo di argomenti di una chiamata di funzione, quindi il programmatore deve definire convenzioni che il chiamante adotta per specificare il numero e il tipo di argomenti:
- si può usare uno degli argomenti fissi per specificare il numero di argomenti con cui la funzione viene chiamata, ma può essere applicata solo se gli argomenti sono tutti dello stesso tipo
- si può usare un valore speciale (sentinella) come ultimo argomento, applicabile solo se gli argomenti opzionali sono dello stesso tipo
- si può usare uno degli argomenti fissi come pattern, il quale esprime tipo e numero di argomenti opzionali (es. specificatori di formato)
Nelle funzioni variadiche gli argomenti fissi hanno nome mentre quelli opzionali no. Per accedere a questi argomenti e necessario perciò usare macro parametriche definite nella libreria stdarg.h, e per accedervi:
- si inizializza un puntatore, di tipo va_list usando la macro va_start, passando a va_start il nome dell’ultimo argomento fisso della funzione
- si accede agli argomenti usando la macro va_arg, in cui è necessario specificare il tipo di dato, la prima invocazione accede al primo argomento opzionale, la seconda al secondo
- si termina l’uso della variabile di tipo va_list con la macro va_end
Quindi è possibile accedere agli argomenti opzionali illimitatamente, usando diverse variabili
di tipo di va_list, inizializzando ognuna con la macro va_start.
Non ci sono indicazioni sui tipi usati per gli argomenti opzionali, quindi ci sono le promozioni di default: gli interi sono int, i tipi in virgola mobile sono double, quindi va_arg(ap, float) non è corretta, perche provoca un comportamento non definito.
Considerazione generale: è complicato definire funzioni con argomenti di tipo diverso.
Domande da interrogazione
- Cosa sono le funzioni variadiche in C e come vengono dichiarate?
- Quali convenzioni deve adottare il programmatore per gestire il numero e il tipo di argomenti in una funzione variadica?
- Come si accede agli argomenti opzionali in una funzione variadica?
Le funzioni variadiche in C sono funzioni che accettano un numero variabile di argomenti. Vengono dichiarate usando le elissi ( , …) e richiedono almeno un argomento fisso.
Il programmatore può usare un argomento fisso per specificare il numero di argomenti, un valore sentinella come ultimo argomento, o un argomento fisso come pattern per esprimere tipo e numero di argomenti opzionali.
Si accede agli argomenti opzionali inizializzando un puntatore di tipo va_list con la macro va_start, usando va_arg per accedere agli argomenti specificando il tipo di dato, e terminando con va_end.