Вы можете вернуть пользовательские данные с метатаблицей, которая проксирует вашу функцию C через метаметод __call
.Таким образом, пользовательские данные могут быть вызваны как функция.Ниже приведен полный пример программы.
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdio.h>
/* this is the C function you want to return */
static void
cfunction(const char *s)
{
puts(s);
}
/* this is the proxy function that will be used as the __call metamethod */
static int
proxy(lua_State *L)
{
luaL_checkudata(L, 1, "proxy");
cfunction(luaL_checkstring(L, 2));
return 0;
}
/* this global function returns the C function with a userdata proxy */
static int
getproxy(lua_State *L)
{
lua_newuserdata(L, sizeof (int));
luaL_getmetatable(L, "proxy");
lua_setmetatable(L, -2);
return 1;
}
int
main(int argc, char **argv)
{
lua_State *L;
L = luaL_newstate();
/* create the proxy metatable */
luaL_newmetatable(L, "proxy");
lua_pushcfunction(L, proxy);
lua_setfield(L, -2, "__call");
/* set the global function that returns the proxy */
lua_pushcfunction(L, getproxy);
lua_setglobal(L, "getproxy");
/* see if it works */
luaL_dostring(L, "p = getproxy() p('Hello, world!')");
lua_close(L);
return 0;
}
Оглядываясь назад, я полностью обдумал то, что вы спрашиваете.Все, что вам действительно нужно сделать, - это создать функцию типа lua_CFunction, которая извлекает параметры из стека Lua и передает их целевой функции C.Код выше отвечает на ваш вопрос буквально, но это, вероятно, излишне для того, что вам действительно нужно сделать.