W języku C funkcje mogą przyjmować stałą lub zmienną liczbę argumentów. Standardowe funkcje są definiowane tak:
int sum(int a, int b) { return a + b; }
Dla zmiennej liczby argumentów używa się makra <stdarg.h>, co pozwala obsłużyć różną liczbę parametrów wejściowych.
Przykład:
#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; }
Czym różnią się funkcje z zmienną liczbą argumentów od funkcji przeciążonych i jak zaimplementować przeciążenie w C?
Odpowiedź: W C nie ma wsparcia dla przeciążania funkcji jak w C++: nazwa funkcji i liczba argumentów muszą być unikalne. Zmienne argumenty realizują uniwersalny interfejs, ale to nie jest "przeciążenie".
Przykład (błędny):
// To nie zadziała w C, ponieważ nie można tworzyć dwóch funkcji o tej samej nazwie: int foo(int a); float foo(float b); // Błąd kompilacji.
Historia
Historia
va_end, co spowodowało wyciek zasobów na niektórych architekturach. Objawy pojawiły się dopiero przy wielokrotnym użyciu funkcji.Historia
Podczas przetwarzania funkcji z zmiennymi argumentami użyto va_list dwa razy bez wywołania va_copy, co spowodowało nieprzewidywalne zachowanie. Błąd ujawnił się dopiero po zmianach kompilatora.