如何让lua_pcall调用的C函数返回值被通用包装函数正确返回?
让Lua C API包装函数返回被调用函数的返回值
要实现generic_pcall_wrapper返回被包装函数(如sum)的返回值,核心是利用Lua栈的特性:当lua_pcall成功执行C函数后,栈上的元素数量恰好等于该C函数返回的数值(即返回值的数量)。
修改后的代码如下:
static int generic_pcall_wrapper(lua_State* L, int (*funct)(lua_State*)){ int narg = lua_gettop(L); lua_pushcfunction(L, funct); lua_rotate(L, 1, 1); int res = lua_pcall(L, narg, LUA_MULTRET, 0); if(res != 0){ // 自定义错误处理逻辑,示例:保留错误信息并返回1 lua_pushstring(L, lua_tostring(L, -1)); return 1; } // 栈上当前元素数量即为被调用函数的返回值数量 return lua_gettop(L); } static int sum(lua_State* L){ int a = lua_tointeger(L, -1); int b = lua_tointeger(L, -2); lua_pop(L, 1); lua_pushnumber(L, a + b); return 1; } static int foo(lua_State* L){ return generic_pcall_wrapper(L, sum); }
原理说明
lua_pcall执行时,会弹出栈上的函数和参数,调用目标C函数后将返回值压入栈。- 对于符合Lua C API规范的函数,其返回的整数代表压入栈的返回值数量,
lua_pcall成功后,栈上的元素总数正好等于这个数值。 - 因此直接返回
lua_gettop(L)就能获取被包装函数的返回值,完美适配不同返回值数量的函数。
内容的提问来源于stack exchange,提问作者Alberto Tiraboschi
相关产品推荐
相关产品推荐

