上一篇文章描述了Lua和C交互的原理, 这篇文章主要通过Demo程序加深Lua和C的交互. 涉及到交互,分为:
- Lua中如何调用C函数
- C中如何调用Lua函数
这里先描述C中如何调用Lua函数, 想象一下, C到底怎么和Lua进行通信,如何告诉它我调用的是xxx参数?
- Lua采取的是利用栈进行交互
- Lua提供了C API对栈进行操作, 利用各种Lua_pushXXX将不同的值压入栈中,然后调用Lua脚本时自然会退栈取出参数运行
- Lua栈状态需要自己进行维护,若发生多线程同时对Lua栈操作,没有加锁保护的话会导致栈状态混乱
hello.lua
str = "hello world"
-- 定义一个tab
tb = {name = "hello",id = 20180119}
注意: Lua使用--
表示为注释
main.c
#include<lua.h>
#include<lauxlib.h>
#include<lualib.h>
#include<stlib.h>
#include<stdio.h>
int main(void)
{
char *str;
lua_State *L;
int li;
L = luaL_newstate(); /* 创建Lua虚拟机*/
luaL_openlibs(L); /* 加载Lua基本库 */
luaL_loadfile(L, "hello.lua"); /* 加载Lua文件,但是不运行 */
lua_pcall(L, 0, 0, 0); /* 运行Lua文件,参数个数, */
//luaL_dofile(L,"hello.lua");
li = lua_gettop(L); /* 返回栈顶索引(即栈长度)*/
lua_getglobal(L,"str"); /* 获取str的值,压入栈中 */
str=lua_tostring(L,1); /* 出栈,将给定索引处的Lua值转换为C字符串 */
printf("str = %s\n",str);
}
-
lua_getglobal(L,"str")
- 执行两步操作
- 首先将str放入栈中
- 然后由Lua去全局表中匹配str的值,并将str的值返回栈顶
-
luaL_dofile(L,"helloscript.lua");
- 它是这样子定义的:
#define luaL_dofile(L,fn) (LuaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
- 相当于
luaL_loadfile + lua_pcall
,不仅加载而且运行
- 它是这样子定义的: