ProgrammazioneProgrammatore di sistema

Descrivi le differenze tra le funzioni con un numero variabile di argomenti e le funzioni standard in C. Come implementare una funzione con un numero variabile di argomenti?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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; }

Domanda trabocchetto

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.

Esempi di errori reali a causa della mancata conoscenza delle sottigliezze dell'argomento


Storia

In un grande progetto è stata utilizzata una funzione con un numero variabile di argomenti, ma non è stato controllato il tipo dei valori passati. Si prevedeva che tutti gli argomenti fossero di tipo int, ma una volta è stato passato un double, il che ha portato a una lettura errata della memoria e a un crash accidentale dell'applicazione.

Storia

Un sviluppatore ha dimenticato di chiamare 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.