最近工作中用到了Lua
作为脚本语言由C/C++宿主语言调用,因为之前没用了解过Lua
,在使用过程中遇到不少不懂得地方,因此决定花一段时间好好了解下Lua
与C交互的API使用方式,本篇文章为第一篇。
前言
Lua 使用一个虚拟栈来和 C 互传值。栈上每一个元素都是一个 Lua 值。(nil,数字,字符串,等等)。无论何时Lua调用C,被调用的函数都得到一个新的栈,这个栈独立于 C 函数本身的栈,也独立于之前的 Lua 栈。它里面包含了 Lua 传递给 C 函数的所有参数,而 C 函数则把要返回的结果放入这个栈以返回给调用者。
Lua 栈可以使用索引
来指向栈上得任何元素:正的索引是栈上得绝对位置(从1开始);负的索引则从栈顶开始的偏移量。
函数
获取栈顶索引
int lua_gettop (lua_State *L);
作用:返回栈顶元素的索引。因为索引是从1开始,所以这个结果等同于栈上得元素个数(返回0表示堆栈为空)
设置栈顶索引
void lua_settop (lua_State *L, int index);
作用:它将栈顶的索引设为这个索引,如果新的栈顶索引比原来大,超出部分的元素会被填为nil。如果新索引为0,则移除所有栈元素。
示例
C 使用 Lua API
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
lua_State *L = lua_open();
printf("begininit : stack top = %d\n", lua_gettop(L));
lua_pushnumber(L, 5);
lua_pushnumber(L, 4);
printf("pushargvs : stack top = %d\n", lua_gettop(L));
lua_settop(L, 1);
printf("settopfun : stack top = %d\n", lua_gettop(L));
lua_settop(L, 0);
printf("settopfun : stack top = %d\n", lua_gettop(L));
return 0;
}
编译执行输出为:
begininit : stack top = 0
pushargvs : stack top = 2
settopfun : stack top = 1
settopfun : stack top = 0
总结
Lua 与 C 之间的操作由栈来传递数据,操作的时候,一定要注意栈顶是否溢出!!
网友评论