I had the same question since I am new to Lua. Since, in my opinion, there was no satisfactory answer, I decided that I would write it, although this question may never be closed. Hope this helps someone else in this situation.
main.c
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int callback_reference = 0;
int lua_registerCallback( lua_State *L ) {
callback_reference = luaL_ref( L, LUA_REGISTRYINDEX );
return 0;
}
void call_callback( lua_State *L ) {
lua_rawgeti( L, LUA_REGISTRYINDEX, callback_reference );
lua_pushvalue( L, 1 );
if ( 0 != lua_pcall( L, 0, 0, 0 ) ) {
printf("Failed to call the callback!\n %s\n", lua_tostring( L, -1 ) );
return;
}
callback_reference = luaL_ref( L, LUA_REGISTRYINDEX );
}
int main( void ) {
lua_State *L = lua_open();
luaL_openlibs( L );
lua_pushcfunction( L, lua_registerCallback );
lua_setglobal( L, "RegisterCallback" );
if ( 0 != luaL_dofile( L, "callback.lua" ) ) {
printf("Failed to load calback.lua!\n %s",
lua_tostring( L, -1 ) );
lua_close( L );
return 1;
}
call_callback( L );
call_callback( L );
luaL_unref( L, LUA_REGISTRYINDEX, callback_reference );
lua_close( L );
return 0;
}
callback.lua
function MyCallback()
print("Hello World!")
end
RegisterCallback( MyCallback )