c++调用lua,lua调用c++

来源:互联网 发布:中印陆军对比知乎 编辑:程序博客网 时间:2024/06/08 19:27

 1首先在官网下载lua的库 将lua编译成动态库

创建工程 引用lua的动态库和工程项目的配置信息  结合 main.lua脚本文件


print("--lua调用c--lua调用c++ 结合部分----------------") --c++ 向lua堆栈写东西 通过lua堆栈 lua通过lua全局标量获取返回lua堆栈再到c++--]]--lua传递数字给c++--cGivelua("wangcheng",  22, 1)  --lua传递一个字符串参数给c++   lua  ture  为0   lua 除了 false 和 nil 之外都是true--local arr={"a001", "a002", "a003"}--cTestArr(arr)  --lua传递数组给c++调用--[[local tab = {name = "xiaoming", age= "22", id="23143"}cTestTable(tab, 123)print("&&&&&&&\n")local a, b = cTestRe()print("a = "..a.."b="..b)--]]--for key, value in pairs(cTestRe()) do --print(key.."="..value.."\n")--endwidth = 1280print("ID:"..TOM)config ={testtile = "wc",height =1080}for key, value in pairs(person) doprint(key.."="..value)endfunction errfun()print("lua is error")endfunction event(p1, p2)   --c++调用lua的函数 c++传参给luaprint("c++ call lua function    "..p1.."==")for key, value in pairs(p2)  doprint(key.."->"..value)endlocal re={id=234}return re--lua传回返回值给c++调用end


extern "C"  //注释:lua都是以c语言编译的,而当前项目是c++项目所以需要声明下此时是c语言的{#include <lua.h>#include <lauxlib.h>#include <lualib.h>};#include <iostream>#include <stdio.h>using namespace std;int cTestRe(lua_State* lua) //lua调用c++  返回值{//lua_pushstring(lua, "return value");  //先栈顶压入一个值//lua_pushstring(lua, "ok");  //先栈顶压入一个值//return 2;  //2个返回值//lua调c++  返回一个表lua_newtable(lua);  //创建了一个lua表lua_pushstring(lua, "name");   //key1  -1lua_pushstring(lua, "reose");  //value1  -2lua_settable(lua, -3);  //告诉堆栈表的位置 把表的位置写进去 后出栈lua_pushstring(lua, "age");lua_pushnumber(lua, 22);lua_settable(lua, -3);lua_pushstring(lua, "id");lua_pushstring(lua, "002");lua_settable(lua, -3);return 1;    }int  cTestTable(lua_State* lua)   //lua传递表给c++ {//printf("init table\n");//lua_pushnil(lua);//while (lua_next(lua, 1) != 0)  //遍历表的数据//{//printf("key =%s, value= %s\n", lua_tostring(lua, -2), lua_tostring(lua, -1));//lua_pop(lua, 1);//}//luaL_checktype(lua, 1, LUA_TTABLE);  //lua调用c++ 参数类型检查 如果参数不对  lua将在这停止不执行下面的操作的 1  一个参数if (lua_type(lua, 2 ) != LUA_TNUMBER) //第二个参数 2{printf("parm 2 is not number\n");}//取其中一个val值  调用表中一个key值lua_getfield(lua, 1, "name");  //local tab = {name = "xiaoming", age= "22", id="23143"}size_t size;printf("name= %s", lua_tostring(lua, -1, &size));return 0;}int cTestArr(lua_State* lua)   //lua 传递数组给c++调用{printf("int cTestArr\n");//获取表大小int  len luaL_getn(lua, 1);   //通过表压在栈低 1local arr={"a001", "a002", "a003"}  cTestArr(arr)  --lua传递数组给c++调用for (int i = 1; i <= len; ++i) //lua  表的下标从1开始的{lua_pushnumber(lua, i);   //获取表本身lua_gettable(lua, 1); //pop index, push table[i]    获取表值 从栈底  底 1, 2, 3  顶 ->  顶 1, 2 ,3 底size_t size;printf("%s\n", lua_tostring(lua, -1, &size));  //从lua堆栈的栈顶获取值lua_pop(lua, 1);    //从lua的栈底出栈   获取表值 从栈底  底 1, 2, 3}return 0;}int cGivelua(lua_State* lua)  //lua调用c++函数  无参数 无返回值  (参数通过压栈{printf("****test**********\n");size_t len;const char* name = lua_tostring(lua, 1, &len); //lua传过来的参数给c++用   第一个参数 1int  age = lua_tonumber(lua, 2);             //第二个参数  2bool isboy = lua_toboolean(lua, 3);//第三个参数 3printf("tile = %s, age =  %d, boy = %d", name, age, isboy);return 0;  //}int main(int argc, char* argv[])   // lua与c++通过lua堆栈交互的{lua_State* lua = lua_open(); //打开lua堆栈的状态luaopen_base(lua);            //打开lua基本库  luaopen_string(lua);//打开lua的string库luaopen_table(lua);//添加table库lua_register(lua, "cGivelua", cGivelua);  //注册 c++通知lua定义了这个函数,通过lua堆栈通知一下lua_register(lua, "cTestArr", cTestArr);lua_register(lua, "cTestTable", cTestTable);lua_register(lua, "cTestRe", cTestRe);//c++为lua设置全局变量  (为lua命名变量所以 必须在读取lua之前)lua_pushstring(lua, "c++ hello");lua_setglobal(lua, "TOM");//c++调用lua 给lua传个表lua_newtable(lua);lua_pushstring(lua, "name");  //keylua_pushstring(lua, "jhon");  //valuelua_settable(lua, -3);lua_pushstring(lua, "age");lua_pushnumber(lua, 33);lua_settable(lua, -3);lua_setglobal(lua, "person"); //创建一个表并命名为lua全局表:personif(luaL_loadfile(lua, "main.lua"))//载入文件 返回0 成功{const char* _error = lua_tostring(lua, -1);   //查看lua报错信息从lua堆栈的顶端取 -1 栈顶 从-1,-2,-3.。。。 栈低cout<<_error<<endl;}if(lua_pcall(lua, 0, 0, 0))//{const char* _error = lua_tostring(lua, -1);cout<<_error<<endl;}// c++调用lua  访问lua全局变量  (由于c++ 调用lua 全局变量 此时必须等c++ 执行了lua文件后才能调用lua)lua_getglobal(lua, "width");  int width = lua_tonumber(lua, -1); //数据从lua栈顶压入lua_pop(lua, 1);  //从栈底弹出  (防止内存泄漏)printf("width=%d\n", width);//c++调用lua 访问表数据lua_getglobal(lua, "config");   //获取lua 全局表压榨lua_getfield(lua, -1, "testtile");printf("ttlename = %s\n",  lua_tostring(lua, -1)); //在栈顶获取value (栈的次序每次都在变化的)lua_pop(lua, 1);lua_getfield(lua, -1, "height");printf("height = %f\n",  lua_tonumber(lua, -1));lua_pop(lua, 1);lua_pop(lua, 1);  //压了3次所以需要出栈 防止lua的堆栈内存泄漏//C++调用lua的函数cout<<"top is="<<lua_gettop(lua)<<endl;  //查看栈的数发生变化没/*int errfun = lua_gettop(lua);lua_getglobal(lua, "errfun");errfun++;*/lua_getglobal(lua, "event");lua_pushstring(lua, "keystore");   //c++调lua  传参给lua函数//lua_pushnumber(lua, 45);lua_newtable(lua);   //为lua传表 需要先创建个表lua_pushstring(lua, "school");lua_pushstring(lua, "shigao");lua_settable(lua, -3);if (lua_pcall(lua, 2, 1, 0))   //2  c++传递lua  函数的参数的个数 3 lua的返回值个数{const char* _error = lua_tostring(lua, -1);   //错误会压栈的  所以防止栈内存泄漏需要处理cout<<_error<<endl;lua_pop(lua, 1);  }else{//cout<<"lua return:  "<<lua_tonumber(lua, -1)<<endl;//lua返回一个表c++获取lua_getfield(lua, -1, "id");cout<<"lua table: id = "<<lua_tonumber(lua, -1)<<endl;lua_pop(lua, 2);}cout<<"top is="<<lua_gettop(lua)<<endl;lua_close(lua);getchar();return 0;}



原创粉丝点击