Liste di argomenti variabili per numero e tipo
|
E' possibile definire funzioni che accettano un numero variabile di argomenti, in c ne sono esempi printf e scanf. Per farlo si usa la sintassi ... nel prototype. Per lavorare, con elenchi che hanno un numero di argomenti variabile, serve la libreria stdarg.h che mette a disposizione ciò che è necessario al programmatore per lavorare con funzioni così flessibili. Ecco un esempio:Codice:int somma(int, ...); somma è un esempio di prototype di una funzione che accetta un numero di argomenti variabili. Nella sua definizione int somma(int argNum, ...) vengono esplicitati i nomi dei parametri, in questo caso solo uno argNum mentre rimane la sintassi ... a indicare una lista variabile. All'interno della funzione sono stati utilizzati le definizioni e macro di stdarg.h -va_list ap; gli oggetti di tipo va_list contengono le informazioni necessarie a lavorare con un numero variabile di argomenti. -void va_start(va_list ap, argNum); è una macro che inizializza l'oggetto di tipo va_list in modo che possa essere utilizzato da va_arg e va_end; deve essere chiamata prima che si tenti di accedere agli argomenti di un elenco variabile. -type va_arg(va_list ap, tipo); è una macro che viene espansa in un'espressione che ha il valore e il tipo dell'argomento successivo di un elenco variabile di argomenti e deve essere chiamata un numero di volte uguale al numero degli argomenti; modifica l'oggetto dichiarato va_list in modo che punti al prossimo argomento dell'elenco. Il tipo deve essere il tipo dell'argomento. -void va_end(va_list ap); è una macro chiamata quando tutti gli elementi di un elenco variabile di argomenti, che era stato inizializzato dalla macro va_start, sono stati elaborati; fa in modo che la restituzione del controllo della funzione sia corretta. L'esempio fatto è semplice, infatti i parametri sono tutti dello stesso tipo (int); in generale l'ultimo argomento a destra prima dei ... è *format, che deve indicare il numero e il tipo dei parametri (per esempio nella funzione printf(const char *format, ...) *format è una stringa che indica il numero e il tipo dei parametri; "a=%d, b=%c" indica che gli argomenti passati alla funzione sono due e che il primo è int e il secondo char).#include <stdio.h> #include <stdarg.h> int somma(int, ...); int main(){ int a = 10, b = 100, c = 1000, d = 10000; printf("%d", somma(2, a, b)); printf("%d", somma(3, a, b, c)); printf("%d", somma(4, a, b, c, d)); } int somma(int argNum, ...){ int totale = 0; va_list ap; va_start(ap, argNum); while(argNum--) totale += va_arg(ap, int); va_end(ap); return totale; }