In de programmeertaal C kunnen functies een vast of een variabel aantal argumenten accepteren. Standaardfuncties worden als volgt gedefinieerd:
int sum(int a, int b) { return a + b; }
Voor een variabel aantal argumenten wordt de macro <stdarg.h> gebruikt, waardoor verschillende aantallen invoerparameters kunnen worden verwerkt.
Voorbeeld:
#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; }
Wat is het verschil tussen functies met een variabel aantal argumenten en overloaded functies, en hoe implementeer je overload in C?
Antwoord: In C is er geen ondersteuning voor function overloading zoals in C++: de naam van de functie en het aantal argumenten moeten uniek zijn. Variabele argumenten implementeren een universele interface, maar dit is geen "overloading".
Voorbeeld (niet juist):
// Dit werkt niet in C, omdat je geen twee functies met dezelfde naam kunt maken: int foo(int a); float foo(float b); // Compilatiefout.
Verhaal
Verhaal
va_end aan te roepen, wat leidde tot een geheugensporen op bepaalde architecturen. De symptomen deden zich pas voor na herhaaldelijk gebruik van de functie.Verhaal
Bij het verwerken van een functie met een variabel aantal argumenten werd va_list twee keer gebruikt zonder va_copy aan te roepen, wat onvoorspelbaar gedrag veroorzaakte. De fout deed zich pas later voor, na wijzigingen in de compiler.