У C ви не можете визначити функцію вбудовано, тому ви не можете створити закриття. Все, що ви робите, - це передача посилання на якийсь заздалегідь визначений метод. У мовах, що підтримують анонімні методи / закриття, визначення методів набагато гнучкіше.
Найпростішими словами, покажчики функцій не мають пов'язаної з ними області дії (якщо не враховувати загальну область дії), тоді як закриття включають область застосування методу, який їх визначає. З лямбдами ви можете написати метод, який пише метод. Закриття дозволяють зв’язати "деякі аргументи з функцією і в результаті отримати функцію нижчого рівня". (взято з коментаря Томаса). Ви не можете цього зробити в C.
РЕДАКТУВАТИ: Додавання прикладу (я буду використовувати синтаксис ActionScript-ish, оскільки саме це мені зараз на думку):
Скажімо, у вас є якийсь метод, який приймає за аргумент інший метод, але не забезпечує способу передачі будь-яких параметрів цьому методу, коли він викликаний? Як, скажімо, якийсь метод, який викликає затримку перед запуском методу, який ви йому передали (дурний приклад, але я хочу спростити це).
function runLater(f:Function):Void {
sleep(100);
f();
}
Тепер скажімо, що ви хочете, щоб користувач runLater () відклав деяку обробку об’єкта:
function objectProcessor(o:Object):Void {
}
function process(o:Object):Void {
runLater(function() { objectProcessor(o); });
}
Функція, яку ви передаєте process (), вже не є якоюсь статично визначеною функцією. Він генерується динамічно і може включати посилання на змінні, які були в області дії, коли метод був визначений. Отже, він може отримати доступ до 'o' та 'objectProcessor', навіть якщо вони не входять до загальної області.
Сподіваюсь, це мало сенс.