lua和C++调用学习笔记系列一
一、lua与C++如何交互
1)C++和lua交互顺序
①C++往lua堆栈里面写东西 ②lua获取这些堆栈的数据后,拿到lua全局表进行操作 ③lua在全局表拿到结果后,再把结果返回到lua堆栈中 ④C++再去读取lua堆栈信息
2)lua堆栈展示
3)lua调用C++函数代码示例
(1)传递参数类型
数字、字符串、bool、用户类型
(2)获取返回值类型
数字、字符串、bool、结构体对象
-
first.cpp
#include <lualib.h> #include <string.h> //定义函数 //lua_State状态,我们通过状态来操作堆栈、调试、内存监控 int CTest(lua_State* L) { printf("int CTest "); return 0;//返回结果个数, //返回0表示没有返回值,返回一表示一个参数 } int main(int argc,char* argv[]) { lua_State* lua = lua_open(); luaopen_base(lua); luaopen_string(lua); luaopen_table(lua); //注册函数,告诉lua我写了这个函数 lua_register(lua,"CTest",CTest);//CTest是名称,可以和函数名是不一致的,可以自己定义的 if(luaL_loadfile(lua,"main.lua")) { const char* error = lua_tostring(lua,-1); printf("lua load error:%s ",error); } }
-
main.lua
CTest()
4)执行结果
二、lua传递参数返回给C/C++
-
参数传递顺序(lua的压栈是从底部位置1开始的) 从栈底1开始,从1到4,访问第一个参数的方式就是通过访问栈底第一个参数
1)传递字符串类型给C/C++
-
main.lua
CTest("lua string",123,true)
-
函数
int CTest(lua_State* L) { size_t len = 0; const char* str = lua_tolstring(L,1,&len);//返回栈顶的字符串, //并返回字符串的长度放到len里面 printf("lua name = %s",str); return 0; }
2)传递整数类型
int CTest(lua_State* L) { int age = 0; age = lua_tonumber(L,2); printf("age = %d ",age); }
3)传递bool类型
int CTest(lua_State* L) { bool is = lua_toboolean(L,3); printf("bool is = %d",is); }
三、lua调用C++传递数组
-
main.lua
local arr = { "A001","A002","A003","A004"}; CTestArr(arr);
-
main.cpp
#include <lualib.h> #include <string.h> int CTestArr(lua_State* L) { printf("In CTestArr "); int arr_len = luaL_getn(L,1);//获取lua栈底表的大小 for(int i = 0; i < len; ++i) { lua_pushnumber(L,i);//往栈顶压入整数 lua_gettable(L,1);//栈顶元素出栈,并放到表的i的位置 size_t size; printf("%s ",lua_tolstring(L,-1,&size));//打印栈顶元素 lua_pop(L,1); //栈顶元素出栈 } return 0; } int main(int argc,char* argv[]) { lua_State* lua = lua_open(); luaopen_base(lua); luaopen_string(lua); luaopen_table(lua); //注册函数,告诉lua我写了这个函数 lua_register(lua,"CTest",CTest);//CTest是名称,可以和函数名是不一致的,可以自己定义的 lua_register(lua,"CTestArr",CTestArr); if(luaL_loadfile(lua,"main.lua")) { const char* error = lua_tostring(lua,-1); printf("lua load error:%s ",error); } }
-
流程解释
从做到右,栈顶→栈底 ①arr
② 1 arr
③ arr arr = {“A001”,“A002”,“A003”,“A004”,1} 打印栈顶A001 ④ 2 arr ⑤ arr arr = {“A002”,“A003”,“A004”,1,2} //压入表尾 打印栈顶A002 ⑥A002从栈顶弹栈
上一篇:
通过多线程提高代码的执行效率例子