一 概述
《lua c api》系列文章描述的是 C 语言作为宿主语言,与 Lua 程序通讯的 API 接口。
二 stack
Lua 使用虚拟的栈与宿主 C 语言进行通讯,在栈中的每个元素都是 Lua 识别的数据类型。每当 Lua 调用 C 时,被调用的 C 函数都会得到一个新的栈,该栈独立于以前的栈和仍处于活跃状态的 C 函数栈。在此堆栈包含 lua 调用 C 函数的所有参数,C 函数应该将需要返回的结果压入此堆栈中(是否需要清空栈)。
为了方便,在 C 中操作栈时并未严格遵守栈操作语义,可以使用“索引”来查询栈中的元素。正数索引从栈底开始计数,栈底索引为 1;负数索引从栈顶开始计数,栈顶索引为 -1。示例结构:
1 | --------------------------------------- |
注意,使用 0 作为索引会出错。
三 示例
使用 lua5.1.5 版本
1. 程序
在示例中 echo 函数会返回所有调用参数,在返回时栈底元素作为第一个返回值,栈顶元素作为最后一个返回值;sayhi 会清空栈顶并返回一个 “hi” 字符串。
1 | // gcc -fPIC -I/usr/local/lua5.1.5/include -g -c stack.c |
编译命令在代码开始处
2. 调用
在解释器中可以调用测试:
1 | Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio |
四 函数说明
1. 栈顶索引操作
1 | void lua_settop (lua_State *L, int index); |
函数功能:
将 L 的栈顶设置到 index 指定的索引处。
如果 index 比现有的栈顶高,会扩充栈,扩充的栈中值为 nil。
如果 index 比现有的栈顶低,那么 index 到历史栈顶之间的元素会被删除。
如果 index 为 0,那么栈中所有元素都将被删掉。
2. 字符串压入栈
1 | void lua_pushstring (lua_State *L, const char *s); |
将 s 指向的字符串压入 L 的栈顶。字符串会以 “\0” 结束。
需要注意:**lua_pushstring 会做值拷贝,不需要担心调用栈退出后内存回收导致 coredump 问题**。
3. 获得栈顶索引
1 | int lua_gettop (lua_State *L); |
获得栈顶元素的索引。因为栈底索引是 1 所以栈顶元素索引等价于调用栈中所有元素数量。如果返回值为 0 说明栈为空。