C
程序和Lua
库之间通过栈(stack
)来进行数据交换,并且栈中的每个槽位(slot
)都能存放任意的Lua
数据类型值。栈如下图所示:
|________| <-- (-1)
|________| <-- (-2)
|________|
| ...... |
|________| <-- (2)
|________| <-- (1)
栈底以1
为起始索引,而栈顶则以-1
作为起始索引。lua_gettop()
函数可以返回当前栈中的元素个数,同时也是栈顶元素的索引值。如果是空栈,则 lua_gettop()
返回0
。
Lua C API
的核心就集中在对栈的操作上:当想要运行某个Lua
脚本时,需要调用luaL_dofile()
函数。而想执行Lua
脚本的某个函数时,则首先要把函数push
进栈(lua_getglobal()
),如果函数需要参数,则参数也要相应地进栈(lua_pushXX()
)。接下来执行函数(比如lua_pcall()
函数)。当函数退出时,返回值同样push
进栈,C
程序就可以使用lua_toXX()
函数获得结果。请看下面这个例子:
一个简单的Lua
脚本(test.Lua
):
function add (a, b)
return (a+b)
end
C
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
static void bail(lua_State *L)
{
fprintf(stderr, "\nFATAL ERROR:%s\n\n", lua_tostring(L, -1));
exit(1);
}
int main(void)
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dofile(L, "test.lua"))
{
bail(L);
}
lua_getglobal(L, "add");
lua_pushnumber(L, 1);
lua_pushnumber(L, 2);
if (lua_pcall(L, 2, 1, 0))
{
bail(L);
}
printf("%g\n", lua_tonumber(L, -1));
lua_close(L);
return 0;
}
执行结果如下:
3