In C können Sie die Funktion nicht inline definieren, sodass Sie keinen Abschluss erstellen können. Sie geben lediglich einen Verweis auf eine vordefinierte Methode weiter. In Sprachen, die anonyme Methoden / Abschlüsse unterstützen, ist die Definition der Methoden viel flexibler.
Im einfachsten Fall ist Funktionszeigern kein Bereich zugeordnet (es sei denn, Sie zählen den globalen Bereich), wohingegen Abschlüsse den Bereich der Methode enthalten, die sie definiert. Mit Lambdas können Sie eine Methode schreiben, die eine Methode schreibt. Mit Closures können Sie "einige Argumente an eine Funktion binden und dadurch eine Funktion mit niedrigerer Arität erhalten". (entnommen aus Thomas 'Kommentar). Das kann man in C nicht machen.
BEARBEITEN: Hinzufügen eines Beispiels (Ich werde die Actionscript-artige Syntax verwenden, da ich gerade daran denke):
Angenommen, Sie haben eine Methode, die eine andere Methode als Argument verwendet, aber keine Möglichkeit bietet, Parameter an diese Methode zu übergeben, wenn sie aufgerufen wird? Wie zum Beispiel eine Methode, die eine Verzögerung verursacht, bevor die Methode ausgeführt wird, die Sie übergeben haben (dummes Beispiel, aber ich möchte es einfach halten).
function runLater(f:Function):Void {
sleep(100);
f();
}
Angenommen, Sie möchten runLater () verwenden, um die Verarbeitung eines Objekts zu verzögern:
function objectProcessor(o:Object):Void {
/* Do something cool with the object! */
}
function process(o:Object):Void {
runLater(function() { objectProcessor(o); });
}
Die Funktion, die Sie an process () übergeben, ist keine statisch definierte Funktion mehr. Es wird dynamisch generiert und kann Verweise auf Variablen enthalten, die zum Zeitpunkt der Definition der Methode im Gültigkeitsbereich waren. Es kann also auf 'o' und 'objectProcessor' zugreifen, obwohl diese nicht im globalen Bereich liegen.
Ich hoffe das hat Sinn gemacht.