Мне очень нравится конструкция defer в «Гоу» — очень удобно для управления ресурсами, можно рядом с получением какого-либо ресурса сразу прописать и его освобождение, так сложнее забыть освободить выделенное.
Оказывается в прошлом году её предложили добавить и в Си (чему я очень рад, потому что в последнее время больше всего, пожалуй, пишу именно на нём), а в 22-й версии «силанга» уже даже есть реализация, можно попробовать.
Интересно, как они его реализуют. Первой пришла в голову идея размещения на стеке таблицы ссылок на внутренние безымянные функции, связанная с блоком. Тогда каждый _Defer преобразуется в функцию. Таблица заполняется в процессе выполнения данными вида: адрес функции, парам1, парам2..., где парам — локальные переменные, используемые внутри _Defer. При выходе из блока пробегаемся вверх по стеку и вызываем call’ами эти безымянные функции используя параметры, которые уже лежат здесь же на стеке. Когда я увидел пример 16, где в цикле вызывается printf каждый раз с новым параметром, я задумался. Параметры используемые внутри _Defer надо хранить, и в цикле можно нечаянно учинить переполнение стека. Зато для отладки можно вставить внутрь цикла _Defer, в котором используется интересующая переменная, а потом разглядывая в отладчике стек, можно посмотреть динамику её сохранения (шучу).
Так уже реализовали, я об этом и пишу. Можно скачать clang 22 и посмотреть.