Im C können Funktionen eine feste oder variable Anzahl von Argumenten annehmen. Standardfunktionen werden wie folgt definiert:
int sum(int a, int b) { return a + b; }
Für eine variable Anzahl von Argumenten wird das Makro <stdarg.h> verwendet, was es ermöglicht, eine unterschiedliche Anzahl von Eingabewerten zu verarbeiten.
Beispiel:
#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; }
Was unterscheidet Funktionen mit variabler Argumentanzahl von überladenen Funktionen und wie implementiert man Überladung in C?
Antwort: C unterstützt keine Überladung von Funktionen wie C++: Der Funktionsname und die Argumentanzahl müssen eindeutig sein. Variable Argumente implementieren ein universelles Interface, aber das ist keine "Überladung".
Beispiel (falsch):
// Das wird in C nicht funktionieren, da man keine zwei Funktionen mit demselben Namen erstellen kann: int foo(int a); float foo(float b); // Kompilierungsfehler.
Geschichte
Geschichte
va_end aufzurufen, was auf einigen Architekturen zu Ressourcenlecks führte. Die Symptome traten nur bei mehrfacher Verwendung der Funktion auf.Geschichte
Bei der Verarbeitung einer Funktion mit variabler Argumentanzahl wurde va_list zweimal ohne Aufruf von va_copy verwendet, was zu unvorhersehbarem Verhalten führte. Der Fehler trat nicht sofort auf, sondern erst nach Änderungen des Compilers.