接上一篇文章:C++调用Lua
本文在上一篇文章的基础上,使用Lua调用C++。使用文章:https://zhuanlan.zhihu.com/p/96848521
的方法。
本文的Lua版本为5.3.4
Lua调用C++
具体过程为:
1,Lua调用C++中的函数Average
2,Average返回结果给Lua
#include <stdio.h>
#include <string.h>
#include <iostream>
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
using namespace std;
lua_State* L;//C++与Lua的通信机制
int Average(lua_State *L)
{
//code3 lua_gettop是取出栈顶的索引值。此时栈顶的索引值大小就是站内元素的个数
int n = lua_gettop(L);
double sum = 0;
//code4 使用循环变量站内所有的元素,通过lua_tonumber取出栈内的值,然后进行相加操作。
for (int i = 1; i <= n; ++i)
sum += lua_tonumber(L, i);
//code5 将运算后的值返还给Lua。把要返回的值再压入栈。此时此时栈内7条数据,参考栈的运行图Log index 2
lua_pushnumber(L, sum / n);//average
lua_pushnumber(L, sum);//sum
//code6 告诉lua主程序,返回2个值。lua这是可以用参数接受这两个值
return 2;
}
int main()
{
L = luaL_newstate();//这一点与原文方法不一样,5.3.5版本中使用luaL_newstate初始化L,而原文使用lua_open
luaL_openlibs(L);
//code1 lua_register注册函数把Lua函数和C++函数进行绑定。其实就是先用lua_pushcfunction把在c++中定义的函数压如栈中,然后lua_setglobal来设置栈顶的元素对应的值,这样就可以把lua函数和栈顶的c++函数建立引用关系。
lua_register(L, "average", Average);
//code2 加载并执行lua脚本,此时lua中的函数average被执行,同时向栈中压如5个参数。参考栈的运行图Log index 1
luaL_dofile(L, "testLC.lua");
lua_close(L);
printf("Press enter to exit...");