ProgrammatieEmbedded C ontwikkelaar

Beschrijf hoe callback-functies werken en worden geïmplementeerd in de C-taal. Hoe declareer en gebruik je dergelijke functies correct bij het ontwikkelen van bibliotheken of het interageren met API's?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Callback-functies zijn functies waarvan het adres als argument aan een andere functie wordt doorgegeven. Dit maakt het mogelijk om gebeurtenisbehandelaars, gebruikersalgoritmen en plugins te implementeren.

Declaratie van een callback-functie:

  1. Beschrijf het bijbehorende type functiewijzer:
typedef void (*callback_func_t)(int);
  1. Doorgeven van de handlerfunctie:
void process(callback_func_t cb) { // ... cb(42); // aanroep van callback } void handler(int n) { printf("Verwerkt nummer: %d\n", n); } int main() { process(handler); return 0; }

Tips:

  • Houd je aan een expliciete typedef voor wijzer types, de code wordt leesbaarder.
  • Zorg ervoor dat de handtekening van de callback-functie overeenkomt met wat verwacht wordt.
  • Vermijd het doorgeven van lokale, niet-geïnitialiseerde of vrijgegeven functies.

Misleidende vraag

Kan een functie met een niet-overeenkomende handtekening als callback worden doorgegeven?

Veelvoorkomend foutief antwoord: "Ja, C staat dat toe, als je expliciete cast gebruikt."

Juiste antwoord: Hoewel formele cast mogelijk is, zal het aanroepen van zo'n functie leiden tot onbepaald gedrag - onjuiste waarden kunnen aan de parameters worden doorgegeven, de stack kan beschadigd raken.

Voorbeeld van gevaar:

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); } // GEVAARLIJK: handtekeningen verschillen

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp


Verhaal

In een ingebed project ontving de sorteervuncie als vergelijkingsfunctie een pointer naar een functie met een te nauwe handtekening. Dit leidde tot sorte fouten en geheugenbeschadiging door onjuiste parameteroverdracht.

Verhaal

In de grafische engine bibliotheek was een gebeurtenismodel op basis van callbacks geïmplementeerd, maar een deel van de callbacks verwees per ongeluk naar lokale functies uit al vrijgegeven dynamische bibliotheken, wat leidde tot crashes bij het tegenkomen van ongeldige adressen.

Verhaal

Bij de ontwikkeling van een cross-platformsysteem identificeerde de auteur de aanroepconventie voor callback-functies verkeerd. Dit viel niet op in één OS, maar leidde tot een crash van het programma op een ander bij het aanroepen van callbacks vanuit een C-bibliotheek.