Lambdas in C++ und Kontextübergabe an Callbacks in C
In dieser Lektion nimmst du mit Lambdas in C++ lokale Daten in einen Callback mit und vergleichst das mit der Kontextübergabe per void-Zeiger in C.
Einführung
Ein Lambda erzeugt eine namenlose Funktion direkt an Ort und Stelle und kann umliegende lokale Variablen "einfangen" (capture), um sie darin zu verwenden. In C kann ein Callback selbst keine Daten mitnehmen, deshalb muss der Kontext ausdrücklich übergeben werden, meist über einen void-Zeiger.
Wichtige Punkte
- Verstehe zuerst, wie es in C funktioniert, bevor du die Abstraktionen von C++ lernst.
- Drücke den Besitz von Ressourcen mit RAII und Wertsemantik (value semantics) aus.
- Bevorzuge die typsicheren Werkzeuge von C++ gegenüber Makros und Typumwandlungen.
Codebeispiele in C und C++
#include <stdio.h>
int above(int value, void *context) {
return value > *(int *)context;
}
int main(void) {
int values[] = {2, 7, 4, 9};
int threshold = 5;
int count = 0;
for (int index = 0; index < 4; ++index) {
count += above(values[index], &threshold);
}
printf("%d\n", count);
}
2
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector values{2, 7, 4, 9};
int threshold = 5;
auto above = [threshold](int value) {
return value > threshold;
};
std::cout << std::count_if(values.begin(), values.end(), above)
<< '\n';
}
2
C und C++ im Vergleich
Die Funktion above in C erhält den Schwellenwert über den Parameter void *context und muss ihn vor dem Vergleich in int * umwandeln. In C++ fängt das Lambda die Variable threshold als Wert ein und behält so die Typinformation ohne manuelle Umwandlung. Beide Programme zählen 2 Werte, die größer als 5 sind.
C verwendet Namenskonventionen, Callbacks, Makros und structs mit Kontext.
C++ bietet Abstraktionen mit klarem Gültigkeitsbereich, die typsicher sind und zur Laufzeit meist nichts zusätzlich kosten.
Übungen zur Vertiefung
Führe beide Versionen aus und ändere dann den Code, um zu beobachten, welche Sicherheit jede Sprache bietet.
- Schreibe den Mechanismus zuerst in C und verwende erst dann die entsprechende C++-Funktion.
- Ersetze das manuelle Freigeben von Ressourcen durch RAII.
- Prüfe, ob die Funktion Speicherreservierungen oder Aufrufe virtueller Funktionen verursacht.
Mit einer Challenge üben
Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.
Alle Challenges