您的位置:首页 > 编程语言 > Lua

Lua与C通信——Lua API(一)

2015-06-15 11:57 465 查看
Lua由C语言实现的嵌入式语言。C Api是一组能使C代码和Lua交互的函数。其中包括读写Lua全局变量、调用Lua函数、执行Lua代码,以及注册C函数以供Lua代码调用。

lua_State *L = luaL_newstate(); /*打开Lua*/

luaL_openlibs(L); /*打开标准库*/

lua_pop(L, 1); /*从栈中弹出错误消息*/

lua压入元素

void lua_pushnil (lua_State *L);

void lua_pushboolean (lua_State *L, int bool);

void lua_pushnumber (lua_State *L, lua_Number n);

void lua_pushinteger (lua_State *L, lua_Integer n); // 整形,存储大型字符串的长度,定义ptrdiff_t

void lua_pushlstring (lua_State *L, const char *s , size_t len);

void lua_pushstring (lua_State *L, const char *s);

检查栈空间

int lua_checkstack(lua_State *L ,int sz);

检查特定类型 (检查值是否能转换为数字,对任意数字,lua_isstring都返回真)

int lua_is* (lua_State *L, int index); //*可以是任意Lua类型。lua_isnumber\lua_isstring\lua_istable

int lua_type (lua_State *L, int index);
int lua_isnil (lua_State *L, int index);
int lua_isboolean (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_isfunction (lua_State *L, int index);
int lua_iscfunction (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
int lua_islightuserdata (lua_State *L, int index)
lua_type返回堆栈元素的值类型,当使用无效索引时返回LUA_TNONE(如当堆栈为空的时候)。lua_type返回的类型代码为如下在lua.h中定义的常量:LUA_TNIL,LUA_TNUMBER,LUA_TBOOLEAN,LUA_TSTRING,LUA_TTABLE,LUA_TFUNCTION,LUA_USERDATA,LUA_TTHEARD,LUA_TLIGHTUSERDATA。下面的函数可以将这些常量转换为字符串:
const char* lua_typename (lua_State* L, int type);
从栈中获取一个值

lua_to*()

int lua_toboolean(lua_State *L, int index);

lua_Number lua_tonumber(lua_State *L, index);

lua_Integer lua_tointeger(lua_State *L, index);

const char *lua_tolstring (lua_State *L, int index, size_t *len);

size_t lua_objlen (lua_State *L, int index);

其他栈操作

int lua_gettop (lua_State *L);//返回栈中元素个数,也可以说事站定元素的引索

void lua_settop(lua_State *L, int index);//将栈顶设置为一个制定的位置,即修改占中元素的数量。多出来的将被舍弃

void lua_pushvalue(lua_State *L, int index);//将制定的索引上值得副本压入栈。

void lua_remove(lua_State *L , int index);//删除指定索引上的元素,并将该位置之上的所有元素下移以填补空缺。

void lua_insert(lua_State *L, int index);//移动指定位置之上的所有元素以开辟一个槽的空间,然后将栈顶元素移到该位置。

void lua_replace (lua_State *L, int index);//弹出栈顶的值,并将该值设置到制定索引上,但他不会移动任何东西,

#define lua_pop(L, n) lua_settop(L, -(n) - 1); //定义宏从栈弹出n个元素

以下操作不会对栈产生影响:

lua_settop(L, -1); /*将栈顶元素设置为它的当前值*/

lua_insert(L, -1) ; /*将栈顶元素移动到栈顶*/

luaL_loadfile(L, fname); //从文件fname加载程序块

lua_pcall(L,0,0,0);//运行编译好的程序块。第二个参数是传给待调用函数的参数个数,

第三个参数是期望的结果个数,第四个参数是一个错误处理函数的索引。

若发生错误(文件fname中得语法错误),这两个函数都会把错误消息压入栈,并返回一个非零的错误代码。

此时,程序就调用lua_tostring从栈顶获取该消息。

lua_getglobal(L,"var")会执行两步操作:1.将var放入栈中,2.由Lua去寻找变量var的值,并将变量var的值返回栈顶(替换var)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: