标签:
LUA_C_API
如何使用CAPI存取操作Lua中的值,一组能使C与Lua交互的函数
Lua_C数据交互使用一个虚拟栈:luaState
Lua和C的差异:1、Lua使用垃圾回收,C使用显式的内存释放
2、Lua使用动态类型,C使用静态类型
lua头文件介绍:
lua.h定义了lua提供的基础函数,包括创建Lua环境(LuaState),调用Lua函数(lua_pcall)...
lauxlib.h定义了辅助库提供的函数,以luaL_开头
构建Lua环境执行Lua代码的简单例子:
<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
int main(void){
char buff[256];
int error;
lua_State *L = luaL_newstate(); //打开lua
luaL_openlibs(L); //打开标准库
while(fgets(buff,sizeof(buff),stdin)!=NULL){
error = luaL_loadbuffer(L,buff,strlen(buff),"line") || lua_pcall(L,0,0,0);
if(error){
fprintf(stderr,"%s",lua_tostring(L,-1));
lua_pop(L,1); //从栈中弹出错误消息
}
}
lua_close(L);
return 0;
}</span>
使用栈交互:
优点:除了在c/c++上方便使用还可以轻松应用到其他语言
如果在C中保存Lua table变量,Lua的垃圾回收无法搜索出这个table不是垃圾文件
在Lua中调用该栈的时候,只会改变栈顶,而使用C可以自由检索中间元素
压入栈元素的CAPI:
lua_pushxxx : lua_pushnil(L),lua_pushboolean(L,bool)
压入元素需要提前检查空间:int lua_checkstack(lua_State* L,int sz)
查询栈元素的CAPI:
规则:关于索引->第一个压入栈的元素索引为1;第二个压入索引为2...直到栈顶
还可以以栈顶为参考物:-1表示栈顶元素,-2表示栈顶下面的元素...知道栈底
例子:lua_tostring(L,-1)会将栈顶的值作为一个字符串返回
检查栈中元素的类型:int lua_is*(lua_State* L, int index) : lua_isnumber,lua_istable...
返回栈中元素的类型:lua_type(L,index) : LUA_TNIL,LUA_TBOOLEAN,LUA_TTABLE....
从栈中获取一个值: lua_to*(L,index): lua_toboolean,lua_objlen
其他栈操作:
int lua_gettop(L) :
返回栈元素的个数,或者是栈顶的索引
void lua_settop(L,int index) :
使用lua_settop(L,0)可以清空栈,用负数索引可以从栈弹出元素,大于len则用栈顶元素填充
void lua_pushvalue(L,index) :
将指定索引元素副本压入栈顶
void lua_remove(L,index) :
删除指定索引元素,下移填补
void lua_insert(L,index) :
上移所有元素开辟一个槽空间
void lua_replace(L,index) : 弹出栈顶的值,设置到指定索引上(原栈顶移除)
例子:
<span style="font-size:14px;">
lua_State* L = luaL_newstate();
lua_pushboolean(L,1);
lua_pushnumber(L,10);
lua_pushnil(L);
lua_pushstring(L,"hello");
stackDump(L);
lua_pushvalue(L,-4);
stackDump(L);
lua_replace(L,3);
stackDump(L);
lua_settop(L,6);
stackDump(L);
lua_remove(L,-3);
stackDump(L);
lua_settop(L,-5);
stackDump(L);
lua_close(L);
getwchar();</span>
CAPI中的错误处理
使用setjmp机制
“无保护”模式:当Lua发生错误时,Lua会调用一个“紧急”函数,然后Lua会结束应用程序
不会抛出异常的函数:luaL_newstate,lua_load,lua_pcall,lua_close
如果内存分配错误,不想结束应用程序的方法:
1、设置一个“紧急”函数不要把控制权返回给Lua
2、代码在“保护模式”下运行(常用)
------------------------------------------------------------------------
void lua_rawgeti(lua_State *L,int index,int key);
void lua_rawseti(lua_State *L,int index,int key);
void lua_pushnumber(lua_State *L,int key);
void lua_insert(lua_State *L,int index);
void lua_rawget(lua_State *L,int index);
void lua_rawset(lua_State *L,int index);
void luaL_checktype(Lua_State *L,int index, TYPE) TYPE:LUA_TTABLE,LUA_TFUNCTION
int luaL_checktype(lua_State *L,int index);
void lua_pushvalue(lua_State *L,int index);
void lua_call(lua_State* L,int index,int key);
版权声明:本文为博主原创文章,未经博主允许不得转载。
Lua_CAPI(1)
标签:
原文地址:http://blog.csdn.net/zh13544539220/article/details/47341073