Lua C API

Lua语言是如何与Lua C语言通信的?
        lua利用虚拟栈与C进行数据交换。在栈中的每个元素都表示一个值(nil, string, number etc)
        利用栈进行数据交换,数据采用先进后出原则。
        Lua 的每个元素有两种序号进行编号。

        

Lua如何操作堆栈的
往栈里压值

void lua_pushboolean (lua_State *L, int b);         将Bool值压入栈
void lua_pushnumber (lua_State *L, lua_Number n); 将数值压入栈
void lua_pushstring (lua_State *L, const char *s);         将字符串压入栈

查询栈中的元素
int lua_type (lua_State *L, int index);                 返回 index 索引元素的类型

类型为以下:LUA_TNIL, LUA_TNUMBER, LUA_TBOOLEAN, LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA, LUA_TTHREAD, and LUA_TLIGHTUSERDATA, LUA_TNONE

int lua_isboolean (lua_State *L, int index);
int lua_iscfunction (lua_State *L, int index);
int lua_isfunction (lua_State *L, int index);
int lua_islightuserdata (lua_State *L, int index);
int lua_isnil (lua_State *L, int index);
int lua_isnone (lua_State *L, int index);
int lua_isnoneornil (lua_State *L, int index);
int lua_isnumber (lua_State *L, int index);
int lua_isstring (lua_State *L, int index);
int lua_istable (lua_State *L, int index);
int lua_isthread (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
返回值:是返回1,不是返回0.

获取栈内给定位置的元素值
int lua_toboolean (lua_State *L, int index);
lua_CFunction lua_tocfunction (lua_State *L, int index);
lua_Integer lua_tointeger (lua_State *L, int index);
const char *lua_tolstring (lua_State *L, int index, size_t *len);
lua_Number lua_tonumber (lua_State *L, int index);
const void *lua_topointer (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
lua_State *lua_tothread (lua_State *L, int index);
void *lua_touserdata (lua_State *L, int index);

设置栈顶
void lua_settop (lua_State *L, int index); 设置index索引为栈顶,index之上的元素都被清除
void lua_pushvalue (lua_State *L, int index); 将index索引的数据压入栈顶,index索引数据保留,即有两份数据

移除栈顶元素
void lua_remove (lua_State *L, int index);  删除 index 的元素,index之上的编号往下移动

向栈中插入元素
void lua_insert (lua_State *L, int index); 将栈顶出栈,插入指定 index 索引位置,之前的索引值依次向上移动。
void lua_replace (lua_State *L, int index); 将栈顶出栈,替换掉index索引位置的数据

Lua 编译为字节码
int luaL_dofile (lua_State *L, 
const char *filename -- lua字节码文件,生成一个函数,并用字节码设置函数,最后将函数入栈
-- lua源文件,编译为字节码,并用字节码设置函数,最后将函数入栈
  );
int luaL_loadbuffer (lua_State *L,
                     const char *buff,    -- 将字符串的内容作为源代码进行编译,编译之后也会生成一个函数,并用字节码设置函数,最后将函数入栈
                     size_t sz, -- 长度
                     const char *name -- 
);

Lua执行字节码
如果异常就会抛出异常,退出整个程序
void lua_call (lua_State *L, 
int nargs, -- 参数个数
int nresults  -- 返回值的个数
); -- 调用之前需要将函数入栈,接着参数入栈,然后出栈,再将函数的返回值入栈

如果异常就会抛出异常,不会退出程序

int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);

调用方法:
luaL_dofile ...

lua_call ...






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值