0 预备知识:
至少对Lua手册C API有简单的了解。lua5.3手册中文
1 Lua虚拟机的栈,如图:
假设虚拟机的栈有n个数据:
解释:
两种解释方式:
A,栈顶开始, -1 ...-n
B,栈底开始,1 ...n
二、运行原理和调用栈机制实例
创建main.lua
1 function LuaFunc(a) 2 return 1+a,2,3,4; 3 end
C++
1 //①新建虚拟机 2 lua_State* L = luaL_newstate(); 3 //②载入库 4 luaL_openlibs(L); 5 6 //③这里执行 test.lua Lua文件 7 luaL_dofile(L, "main.lua"); 8 9 //④重新设置栈底 10 lua_settop(L, 0); 11 12 //⑤获取 返回结果 13 lua_getglobal(L, "LuaFunc"); 14 // 打印结果:4 15 printf("栈顶的索引:%d ", lua_gettop(L)); 16 lua_pushinteger(L, 14); 17 18 //⑥操作栈调回结果 19 lua_pcall(L, 1, 4, 0); 20 21 //此时你会发现栈内有4个元素 22 printf("lua_gettop %d ", lua_gettop(L)); 23 24 printf("%s ", lua_tostring(L, 1)); 25 printf("%s ", lua_tostring(L, 2)); 26 printf("%s ", lua_tostring(L, 3)); 27 printf("%s ", lua_tostring(L, 4)); 28 29 //⑦一定记得关闭虚拟机 30 lua_close(L); 31 32 system("pause"); 33 return 0;
运行结果:
分析:
1-3,准备环境,执行Lua文件
4,重新设置栈底
5,获取函数LuaFunc,并且压如栈(栈内有1个元素了),lua_pushinteger将14压入栈(栈内有2个元素了)
6,pop出栈的函数,参数(栈内有0个元素了),计算得到的结果,15,2,3,4 分别压入栈(栈内有4个元素了)