ProgrammierungEmbedded C Entwickler

Beschreiben Sie, wie Callback-Funktionen in C implementiert und verwendet werden. Wie sollten solche Funktionen bei der Entwicklung von Bibliotheken oder der Interaktion mit APIs korrekt deklariert und genutzt werden?

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

Antwort

Callback-Funktionen sind Funktionen, deren Adresse als Argument an eine andere Funktion übergeben wird. Dies ermöglicht die Implementierung von Ereignis-Handlern, benutzerdefinierten Algorithmen und Plugins.

Deklaration einer Callback-Funktion:

  1. Der entsprechende Funktionszeiger-Typ wird definiert:
typedef void (*callback_func_t)(int);
  1. Übergabe der Handler-Funktion:
void process(callback_func_t cb) { // ... cb(42); // Aufruf des Callbacks } void handler(int n) { printf("Zahl verarbeitet: %d\n", n); } int main() { process(handler); return 0; }

Tipps:

  • Halten Sie sich an den expliziten typedef für Zeigertypen, der Code wird lesbarer.
  • Stellen Sie sicher, dass die Signatur der Callback-Funktion mit der erwarteten übereinstimmt.
  • Vermeiden Sie die Übergabe von lokalen, nicht initialisierten oder freigegebenen Funktionen.

Fangfrage

Kann eine Funktion mit nicht übereinstimmender Signatur als Callback übergeben werden?

Häufig falsche Antwort: „Ja, C erlaubt das, wenn ein explizites Typ-Casting durchgeführt wird.“

Richtige Antwort: Obwohl das formale Casting möglich ist, führt der Aufruf einer solchen Funktion zu unvorhersehbarem Verhalten – falsche Werte können an die Parameter übergeben werden, der Stack kann beschädigt werden.

Beispiel für Gefahr:

typedef void (*cb_t)(int); void wrong_cb(double d) { printf("%f\n", d); } void call(cb_t f) { f(123); } int main() { call((cb_t)wrong_cb); } // GEFÄHRLICH: Signaturen unterscheiden sich

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

In einem eingebetteten Projekt erhielt die Sortierfunktion einen Zeiger auf eine Vergleichsfunktion mit einer zu engen Signatur. Dies führte zu Sortierfehlern und Speicherbeschädigungen aufgrund falscher Parameterübergaben.

Geschichte

In einer Grafik-Engine-Bibliothek wurde ein Ereignismechanismus auf Basis von Callbacks implementiert, aber einige Callbacks verwiesen versehentlich auf lokale Funktionen aus bereits freigegebenen dynamischen Bibliotheken, was beim Zugriff auf ungültige Adressen zu Abstürzen führte.

Geschichte

Bei der Entwicklung eines plattformübergreifenden Systems hat der Autor die Calling Convention für Callback-Funktionen falsch festgelegt. Dies trat unter einem bestimmten Betriebssystem nicht auf, führte jedoch zu einem Programmabsturz unter einem anderen Betriebssystem, wenn Callbacks aus einer C-Bibliothek aufgerufen wurden.