Lua与C数据交互三: lua调用C函数

在本节中,将会展示Lua如何调用c函数sub,直接看源代码


#include 
#include 
#include 
#include 

#define LUA_TOP_TYPE(L) {int t = lua_type(L, -1); printf("%s\n", lua_typename(L, t));}
#define LUA_STACK_SIZE(L) printf("stack size: %d \n", lua_gettop(L));

// lua 调用函数的时候,会压栈,调用完会弹栈,不会把值残留到栈中
int sub(lua_State* L) {
    // lua 函数调用的时候,新Block对应新的虚拟栈,不受上一层干扰
    int topNum = lua_gettop(L);
    printf("sub topNum: %d \n", topNum);

    int x = lua_tonumber(L, 1);
    int y = lua_tonumber(L, 2);
    lua_pushnumber(L, x - y);

    return 1;
}

int main()
{

    lua_pushcfunction(L, sub);
    LUA_TOP_TYPE(L);
    // sub in virtual to lua
    lua_setglobal(L, "mysub");// 等价于在lua植入代码 mysub = sub

    LUA_TOP_TYPE(L);
    lua_pushnumber(L, 11);
    lua_pushnumber(L, 12);
    lua_pushnumber(L, 13);
    lua_pushnumber(L, 13);
    LUA_STACK_SIZE(L); // 此时打印4
       //执行mysub,并传入3个参数
    luaL_dostring(L, "print(mysub(2, 1, 10))");

    lua_close(L);
    
    return 1;
}

// 运行结果: 打印1

注意c函数以及调用此行的代码,这几行代码解析如下:


luaL_dostring(L, "print(mysub(2, 1, 10))"); // 参数压栈,该栈为10, 1, 2,执行完之后栈会被清空,不影响外部栈


int sub(lua_State* L) {

    int topNum = lua_gettop(L); // 3个元素,栈的顺序为10, 1, 2
    printf("sub topNum: %d \n", topNum);

    int x = lua_tonumber(L, 1); // 获取栈底第一个元素 2
    int y = lua_tonumber(L, 2); // 获取栈底第二个元素
    lua_pushnumber(L, x - y); // 将结果压入栈

    return 1; //提示返回结果只有一个值
}

然后函数返回值由1改为2,那么打印的结果为{10, 1}, 因为函数调用完,栈上的值为x-y, 10, 1, 2,而返回值要求返回两个。依此谈栈进入print参数10, x-y

而如果代码是

X = mysub(2,1,10)

那么X的值只为1,因为X只取栈顶的值

你可能感兴趣的:(Lua与C数据交互三: lua调用C函数)