C関数を関数メンバーとしてプッシュしたり、C関数をlua関数としてlua_register(L、lua_func_name、c_func);で登録したりしても問題はありません。
しかし、Cからの「foober」の関数コールバックパラメータとしてluaFoo()を渡したいものをluaにどのように伝えますか?lua_pushcfunction-C関数をプッシュし、lua_pushstringはプレーンな文字列のみをプッシュするため、コールバックフィールドは関数ではなく文字列になりました。
Luaコード:
CALLBACKS = {};
FOO = 0;
function luaFoo()
FOO = FOO + 1;
end;
function addCallback(_name, _callback)
CALLBACKS[_name] = _callback;
end;
function doCallback(_name)
CALLBACKS[_name]();
end;
Cコード:
static int c_foo(lua_State* l)
{
printf("FOO\n");
return 0;
}
/*load lua script*/;
lua_State* l = /*get lua state*/;
lua_getglobal(l, "addCallback");
lua_pushstring(l, "foober");
//What push for luaFoo()
lua_pushcfunction(l, c_foo);
lua_call(l, 2, 0);
lua_getglobal(l, "doCallback");
lua_pushstring(l, "foober");
lua_call(l, 1, 0);
類似-すでにlua_registerに登録されているC関数を取得した場合、それらをCからコールバックパラメーターとして渡す方法。c_foo => c_fooがlua関数として存在することを登録し、 「c_foo」をコールバック関数パラメーターとして渡す方法を指定します。