W C nie możesz zdefiniować funkcji inline, więc nie możesz tak naprawdę utworzyć zamknięcia. Wszystko, co robisz, to przekazywanie odniesienia do jakiejś predefiniowanej metody. W językach, które obsługują anonimowe metody / zamknięcia, definicje metod są znacznie bardziej elastyczne.
Mówiąc najprościej, wskaźniki funkcji nie mają skojarzonego z nimi zakresu (chyba że policzysz zasięg globalny), podczas gdy domknięcia obejmują zakres metody, która je definiuje. Za pomocą lambd można napisać metodę, która zapisuje metodę. Zamknięcia pozwalają ci na powiązanie „niektórych argumentów z funkcją i uzyskanie w rezultacie funkcji o niższej wartości”. (zaczerpnięte z komentarza Thomasa). Nie możesz tego zrobić w C.
EDYCJA: Dodanie przykładu (zamierzam użyć składni ActionScript, ponieważ właśnie o tym teraz myślę):
Powiedzmy, że masz metodę, która przyjmuje inną metodę jako argument, ale nie zapewnia sposobu przekazania żadnych parametrów do tej metody, gdy jest ona wywoływana? Na przykład pewna metoda, która powoduje opóźnienie przed uruchomieniem metody, którą ją przekazałeś (głupi przykład, ale chcę, aby był prosty).
function runLater(f:Function):Void {
sleep(100);
f();
}
Teraz powiedzmy, że chcesz, aby użytkownik runLater () opóźnił przetwarzanie obiektu:
function objectProcessor(o:Object):Void {
}
function process(o:Object):Void {
runLater(function() { objectProcessor(o); });
}
Funkcja, którą przekazujesz do process (), nie jest już jakąś statycznie zdefiniowaną funkcją. Jest generowany dynamicznie i może zawierać odwołania do zmiennych, które znajdowały się w zakresie, gdy metoda została zdefiniowana. Tak więc może uzyskać dostęp do „o” i „objectProcessor”, nawet jeśli nie są one objęte zakresem globalnym.
Mam nadzieje że to miało sens.