Nel linguaggio C, le funzioni possono accettare un numero fisso o variabile di argomenti. Le funzioni standard sono definite in questo modo:
int sum(int a, int b) { return a + b; }
Per un numero variabile di argomenti si utilizza il macro <stdarg.h>, che consente di gestire un numero diverso di parametri in ingresso.
Esempio:
#include <stdarg.h> #include <stdio.h> int sum(int count, ...) { int total = 0; va_list args; va_start(args, count); for (int i = 0; i < count; ++i) { total += va_arg(args, int); } va_end(args); return total; }
Quali sono le differenze tra le funzioni con un numero variabile di argomenti e le funzioni sovraccaricate, e come implementare il sovraccarico in C?
Risposta: In C non c'è supporto per il sovraccarico delle funzioni come in C++: il nome della funzione e il numero di argomenti devono essere unici. Gli argomenti variabili implementano un'interfaccia universale, ma non sono un "sovraccarico".
Esempio (sbagliato):
// Questo non funzionerà in C, poiché non è possibile creare due funzioni con lo stesso nome: int foo(int a); float foo(float b); // Errore di compilazione.
Storia
Storia
va_end, il che ha portato a perdite di risorse su alcune architetture. I sintomi si sono manifestati solo dopo un uso ripetuto della funzione.Storia
Durante l'elaborazione di una funzione con argomenti variabili è stato usato va_list due volte senza chiamare va_copy, il che ha causato un comportamento imprevedibile. L'errore si è manifestato non subito, ma solo dopo modifiche al compilatore.