- 一、lua与C++如何交互
- 1)C++和lua交互顺序
- 2)lua堆栈展示
- 3)lua调用C++函数代码示例
- 4)执行结果
- 二、lua传递参数返回给C/C++
- 1)传递字符串类型给C/C++
- 2)传递整数类型
- 3)传递bool类型
- 三、lua调用C++传递数组参数
- 四、lua给C++函数传递表参数
- 1)函数说明
- 2)代码
①C++往lua堆栈里面写东西
②lua获取这些堆栈的数据后,拿到lua全局表进行操作
③lua在全局表拿到结果后,再把结果返回到lua堆栈中
④C++再去读取lua堆栈信息
(1)传递参数类型
数字、字符串、bool、用户类型
(2)获取返回值类型
数字、字符串、bool、结构体对象
- first.cpp
#include#include //定义函数 //lua_State状态,我们通过状态来操作堆栈、调试、内存监控 int CTest(lua_State* L) { printf("int CTestn"); 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:%sn",error); } }
- main.lua
CTest()4)执行结果 二、lua传递参数返回给C/C++
- 参数传递顺序(lua的压栈是从底部位置1开始的)
从栈底1开始,从1到4,访问第一个参数的方式就是通过访问栈底第一个参数
- 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 = %dn",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#include int CTestArr(lua_State* L) { printf("In CTestArrn"); 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("%sn",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:%sn",error); } }
- 流程解释
从做到右,栈顶→栈底
①arr
② 1 arr
③ arr
arr = {“A001”,“A002”,“A003”,“A004”,1}
打印栈顶A001
④ 2 arr
⑤ arr
arr = {“A002”,“A003”,“A004”,1,2} //压入表尾
打印栈顶A002
⑥A002从栈顶弹栈
-
lua_next(L,3)函数说明
1)先从栈顶弹出一个key
2)从栈指定位置的table里取下一对key-value,先将key入栈再将value入栈
3)如果第二步成功返回非0;否则返回0,并且不向栈中压入任何值 -
函数代码
int CTestTable(lua_State* L)
{
return 0;
}
int main(int argc,char* argv[])
{
lua_State* lua = lua_open();
luaopen_base(lua);
luaopen_string(lua);
luaopen_table(lua);
lua_register(lua,"CTestTable",CTestTable);
}
- main.lua
local tab = {name = "xiaoming",age = "22",id = }



