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

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

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

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

部分内容查阅自:《Lua 5.3  参考手册》中文版 译者 云风 制作 Kavcc

 

vs2013+lua-5.3.3

 

1.C++调用Lua中函数

①Lua中的函数

1 function add(x,y)
2     return x + y
3 end

②C++调用函数

 1     //lua->stack,全局函数位置-1
 2     lua_getglobal(L, "add");
 3 
 4     //c->stack,传入函数参数
 5     lua_pushinteger(L, 10);
 6     lua_pushinteger(L, 20);
 7 
 8     //lua->stack,调用函数,2表示传入2个参数,1表示一个返回值,并将返回值放到-1的位置
 9     lua_call(L, 2, 1);
10 
11     //stack->c
12     printf("add function return value : %d\n", lua_tointeger(L, -1));

 

2.Lua调用C++中的函数

①Lua能调用的C++函数必须符合如下函数签名:

 

typedef int (*lua_CFunction) (lua_State *L);

 

在函数里面将相应的数据进行栈操作;

返回值表示入栈供Lua使用的返回值个数。

②C++中函数

函数里的栈都是函数自己私有的,当函数返回时该栈会被自动清空。

 1 int average(lua_State* L){
 2     //lua->stack,得到Lua调用函数输入的个数
 3     int lua_args_count = lua_gettop(L);
 4 
 5     //lua->c,得到所有Lua中输入参数的值
 6     lua_Number sum = 0;
 7     for (int i = 1; i <= lua_args_count; ++i){
 8         sum += lua_tonumber(L, i);
 9     }
10 
11     //c->stack,将平均值和总值返回到Lua中的返回值
12     lua_pushnumber(L, sum / lua_args_count);
13     lua_pushnumber(L, sum);
14 
15     //返回个数给Lua
16     return 2;
17 }

 

③注册C++的函数到Lua中

1 lua_register(L, "average", average);
2 
3 ////lua_register宏替代了下面两个函数
4 //lua_pushcfunction(L, average);
5 //lua_setglobal(L, "average");

 

④Lua中进行调用C++中的函数

1 local ave,sum = 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人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

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

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

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