Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)
部分内容查阅自:《Lua 5.3 参考手册》中文版 译者 云风 制作 Kavcc
vs2013+lua-5.3.3
1.将C++封装为模块
①在Lua中调用的函数(和上一节的函数一样)
1 int average(lua_State* L){
2
3 //stack_dump(L);
4
5
6 //lua->stack,得到Lua调用函数输入的个数
7 int lua_args_count = lua_gettop(L);
8
9 //lua->c,得到所有Lua中输入参数的值
10 lua_Number sum = 0;
11 for (int i = 1; i <= lua_args_count; ++i){
12 sum += lua_tonumber(L, i);
13 }
14
15 //c->stack,将平均值和总值返回到Lua中的返回值
16 lua_pushnumber(L, sum / lua_args_count);
17 lua_pushnumber(L, sum);
18
19 //stack_dump(L);
20
21 //返回个数给Lua
22 return 2;
23 }
②列出需要封装的全局函数
1 static const luaL_Reg mylibs_funcs[] = {
2 { "average", average },
3 { NULL, NULL }
4 };
③定义一个注册模块函数,这个函数必须符合如下函数签名:
typedef int (*lua_CFunction) (lua_State *L);
在该函数里将上面数组列出的函数压到栈里
1 int lua_openmylib(lua_State* L){
2 luaL_newlib(L, mylibs_funcs); //将所有函数放到一个table中
3 return 1; //将这个table压到stack里
4 }
④将自定义模块加到注册列表里(请参考《Lua和C++交互 学习记录之一:C++嵌入脚本》)
1 static const luaL_Reg lua_reg_libs[] = {
2 { "base", luaopen_base },
3 { "mylib", lua_openmylib }, //这里为自定义的模块名字mylib
4 { NULL, NULL }
5 };
⑤注册该模块(请参考《Lua和C++交互 学习记录之一:C++嵌入脚本》)
1 //注册让lua使用的库
2 const luaL_Reg* lua_reg = lua_reg_libs;
3 for (; lua_reg->func; ++lua_reg){
4 luaL_requiref(L, lua_reg->name, lua_reg->func, 1);
5 lua_pop(L, 1);
6 }
2.Lua中进行调用
1 local ave,sum = mylib.average(10,20,30)
2 print("ave : ",ave," sum : ",sum)
Lua和C++交互系列:
《Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块》