В C вы не можете определить встроенную функцию, поэтому вы не можете создать замыкание. Все, что вы делаете, это передаете ссылку на какой-то заранее определенный метод. В языках, которые поддерживают анонимные методы / замыкания, определение методов гораздо более гибкое.
Проще говоря, указатели на функции не имеют связанной с ними области видимости (если не считать глобальную область), тогда как замыкания включают область метода, который их определяет. С лямбдами, вы можете написать метод, который пишет метод. Замыкания позволяют вам связать «некоторые аргументы с функцией и получить в результате функцию с меньшим числом аргументов». (взято из комментария Томаса). Вы не можете сделать это в C.
РЕДАКТИРОВАТЬ: Добавление примера (я собираюсь использовать синтаксис Actionscript-ish, потому что это то, что у меня сейчас на уме):
Скажем, у вас есть метод, который принимает другой метод в качестве аргумента, но не предоставляет способ передать какие-либо параметры этому методу при его вызове? Как, скажем, некоторый метод, который вызывает задержку перед запуском метода, который вы передали (глупый пример, но я хочу, чтобы он был простым).
function runLater(f:Function):Void {
sleep(100);
f();
}
Теперь скажите, что вы хотите использовать runLater (), чтобы отложить некоторую обработку объекта:
function objectProcessor(o:Object):Void {
/* Do something cool with the object! */
}
function process(o:Object):Void {
runLater(function() { objectProcessor(o); });
}
Функция, которую вы передаете process (), больше не является статически определенной функцией. Он генерируется динамически и может включать ссылки на переменные, которые находились в области видимости при определении метода. Таким образом, он может обращаться к «o» и «objectProcessor», даже если они не входят в глобальную область.
Надеюсь, это имело смысл.