ProgrammatieSysteemprogrammeur

Beschrijf de verschillen tussen functies met een variabel aantal argumenten en standaardfuncties in C. Hoe implementeer je een functie met een variabel aantal argumenten?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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

Misleidende vraag

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.

Voorbeelden van echte fouten door gebrek aan kennis over de subtiliteiten van het onderwerp


Verhaal

In een groot project werd een functie met een variabel aantal argumenten gebruikt, maar de types van de doorgegeven waarden werden niet gecontroleerd. Er werd verwacht dat alle argumenten van het type int zouden zijn, maar één keer werd een double doorgegeven, wat leidde tot onjuiste geheugentoegang en een onverwachte crash van de applicatie.

Verhaal

Een ontwikkelaar vergat 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.