You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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);
}

原理说明

  1. lua_pcall执行时,会弹出栈上的函数和参数,调用目标C函数后将返回值压入栈。
  2. 对于符合Lua C API规范的函数,其返回的整数代表压入栈的返回值数量,lua_pcall成功后,栈上的元素总数正好等于这个数值。
  3. 因此直接返回lua_gettop(L)就能获取被包装函数的返回值,完美适配不同返回值数量的函数。

内容的提问来源于stack exchange,提问作者Alberto Tiraboschi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:25:11