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从栈顶弹栈

经验分享 程序员 微信小程序 职场和发展