常用lua c api
lua栈索引顺序说明
从栈顶往栈底:-1, -2, -3......
从栈底往栈顶: 1, 2, 3......
操作表
LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); //创建新表, 压入栈顶, narr为初始数组大小, nrec为初始hash表大小 #define lua_newtable(L) lua_createtable(L, 0, 0) LUA_API int (lua_setmetatable) (lua_State *L, int objindex); //操作对象为栈[objindex]处的值, metatable为栈顶的值。栈顶弹出1个元素 LUA_API void (lua_rawset) (lua_State *L, int idx); //操作对象为栈[idx]处的值, key为栈[-2]的值, value为栈顶的值。栈顶弹出2个元素 LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); //操作对象为栈[idx]处的值, key为栈[n]的值, value为栈顶的值。栈顶弹出1个元素 LUA_API void (lua_rawget) (lua_State *L, int idx); //操作对象为栈[idx]处的值, key为栈顶的值, 弹出栈顶元素, obj[key]压入栈顶 LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); //操作对象为栈[idx]处的值, key为栈[n]的值, obj[key]压入栈顶, 不会弹出栈元素 LUA_API void (lua_settable) (lua_State *L, int idx); //操作对象为栈[idx]处的值, key为栈[-2]的值, value为栈顶的值。栈顶弹出2个元素 LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); //操作对象为栈[idx]处的值, key由参数提供, value为栈顶的值。栈顶弹出1个元素 #define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) //操作对象为全局表, key由参数提供, value为栈顶的值。栈顶弹出1个元素 LUA_API void (lua_gettable) (lua_State *L, int idx); //操作对象为栈[idx]处的值, key为栈顶的值,弹出栈顶元素,obj[key]压入栈顶 LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); //操作对象为栈[idx]处的值, key由参数提供,obj[key]压入栈顶 #define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) //操作对象为全局表, key由参数提供,obj[key]压入栈顶
栈元素转换
这部分api都不会操作栈
LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); //将栈[idx]处的值转换为浮点数; 出错时不会抛异常, 返回默认值 LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum); //将栈[idx]处的值转换为浮点数, 出错时isnum会被设为0, lua5.2版本之后才有 LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); LUA_API int (lua_toboolean) (lua_State *L, int idx); LUA_API const char*(lua_tolstring) (lua_State *L, int idx, size_t *len); LUA_API size_t (lua_objlen) (lua_State *L, int idx); LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); LUA_API void*(lua_touserdata) (lua_State *L, int idx); LUA_API lua_State*(lua_tothread) (lua_State *L, int idx); LUA_API const void *(lua_topointer) (lua_State *L, int idx);
栈元素类型检查
这部分api不错操作栈
LUA_API int (lua_isnumber) (lua_State *L, int idx); //栈[idx]处的值是否为数字 LUA_API int (lua_isstring) (lua_State *L, int idx); //栈[idx]处的值是否为字符串 LUA_API int (lua_iscfunction) (lua_State *L, int idx); LUA_API int (lua_isuserdata) (lua_State *L, int idx); LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, size_t *l); //检查栈顶function对象的第n个参数是否为string类型, 返回该字符串, 并将字符串长度填充到l上 LUA_API int (lua_type)(lua_State *L, int idx); //栈[idx]处的元素类型 LUA_API const char*(lua_typename) (lua_State *L, int tp); //类型名字, tp为lua_type函数返回的类型值 #define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) #define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) #define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) #define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) #define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) #define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) #define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) #define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
栈顶push元素
LUA_API void (lua_pushnil) (lua_State *L); //nil压入栈顶 LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); //浮点数压入栈顶 LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); //整数压入栈顶 LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); //压入指定长度的字符串 LUA_API void (lua_pushstring) (lua_State *L, const char *s); //压入字符串, 长度由\0决定 LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, va_list argp); LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); LUA_API void (lua_pushboolean) (lua_State *L, int b); //boolean压入栈顶 LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); //userdata压入栈顶 LUA_API int (lua_pushthread) (lua_State *L); //线程状态压入栈顶 #define lua_pushliteral(L, s) lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) //压入常量字符串
栈操作
LUA_API int (lua_gettop) (lua_State *L); //获取栈元素数量 LUA_API void (lua_settop) (lua_State *L, int idx); //设置栈元素数量, idx更大用nil补足, idx更小清掉多余元素 LUA_API void (lua_pushvalue) (lua_State *L, int idx); //栈[idx]处的元素再压到栈顶 LUA_API void (lua_remove) (lua_State *L, int idx); //移除栈idx处的元素 LUA_API void (lua_insert) (lua_State *L, int idx); //将栈顶元素移到栈idx处 LUA_API void (lua_replace) (lua_State *L, int idx); //弹出栈顶元素, 并将栈[idx]处替换为该元素
全局注册表
该表对应的索引为LUA_REGISTRYINDEX,使用lua_pushvalue(L, LUA_REGISTRYINDEX)压入栈顶
int (luaL_newmetatable) (lua_State *L, const char *tname); // 创建一个新表(后续作为元表)压入栈顶, 并将该表存入全局注册表的tname处。 #define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) // 从全局注册表获取名字为n的表(后续作为元表), 并压入栈顶, 如果没有则压入nil LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); // 检查栈[ud]处的用户数据的元表, 是否为全局注册表[tname]的值, 返回该用户数据或NULL
其他
引用持有或释放
LUALIB_API int (luaL_ref) (lua_State *L, int t); //弹出栈顶元素, 为它分配一个唯一id, 并将它存在栈[t][id]处, 返回该id LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); //栈[t][ref] = nil, 这样对应的对象可以被回收
LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); //调用函数
例如:lua_call(c->L, 2, 1); //栈[-3]为操作对象, 栈[-2]为第1个参数, 栈[-1]为第2个参数, 栈顶弹出3个元素, 1个函数返回值压入栈顶
参考
C++ 与 Lua 数据交互载体——栈_Lua-CSDN专栏
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
2023-02-17 后处理 - 屏幕置灰