• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua和C++交互学习记录之七:C++全局函数注册为Lua模块

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)

部分内容查阅自:《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和C++交互 学习记录之二:栈操作

Lua和C++交互 学习记录之三:全局值交互

Lua和C++交互 学习记录之四:全局table交互

Lua和C++交互 学习记录之五:全局数组交互

Lua和C++交互 学习记录之六:全局函数交互

Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块

Lua和C++交互 学习记录之八:C++类注册为Lua模块

Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua中的sleep实现发布时间:2022-07-22
下一篇:
Lua通过COM调用外部程序excel及调用windowsapi发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap