Комментарии 6
Первый пример не компилируется:
int add(void *a, int b, int (*f)(void *ctx)) {
return f(a, b);
}Переменная f объявлена как указатель на функцию с одним аргументом, а вызывается с двумя. Замечание в сторону, сервис по кнопке код вполне "объяснил".
Сложным путем идет товарищ... Что мешало просто сохранить findex в стеке Lua?
При выходе из CALLBACK, где создаётся значение findex, стэк будет очищен, потому findex сделана глобальной, чтобы REAL_CALLBACK смог получить значение findex и вытащить из регистра (lua_rawgeti(L, LUA_REGISTRYINDEX, findex)) сохранённую функцию на Lua.
Ниже @4z0t верно предложил использовать lua_pushcclosure, чтобы закинуть findex в качестве upvalue для REAL_CALLBACK.
Не понимаю к чему эти танцы с бубнами и непортируемым кодом, когда есть lua_pushcclosure...
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Создаём замыкания С из замыканий Lua