ProgrammierungSystemprogrammierer

Beschreiben Sie die Unterschiede zwischen Funktionen mit variabler Argumentanzahl und Standardfunktionen in C. Wie implementiert man eine Funktion mit variabler Argumentanzahl?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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

Fangfrage

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.

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas


Geschichte

In einem großen Projekt wurde eine Funktion mit variabler Argumentanzahl verwendet, aber der Typ der übergebenen Werte wurde nicht überprüft. Es wurde erwartet, dass alle Argumente vom Typ int sind, aber einmal wurde ein double übergeben, was zu einem falschen Speicherzugriff und einem zufälligen Absturz der Anwendung führte.

Geschichte

Ein Entwickler vergaß, 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.