下面通过一个简单的例子演示如何让 Lua 脚本调用 C++ 中实现的函数。核心思路是:在 C++ 端编写符合 Lua C API 规范的函数,通过 lua_register 将其注册到 Lua 虚拟机,然后在 Lua 脚本中像调用普通函数一样使用它。

C++ 端:注册并实现 get_sum

在 C++ 端实现一个 get_sum 函数,它从 Lua 栈中依次取出所有参数,把数值类型累加后再把结果压回栈中返回给 Lua。若遇到非数值参数,则压入一个错误字符串作为返回值。main 函数负责创建 Lua 虚拟机、加载标准库、注册 get_sum,再执行脚本文件 a.lua

extern "C"{
#include "src/lualib.h"
#include "src/lauxlib.h"
#include "src/lua.h"

}

#include "iostream"
using namespace std;



int get_sum(lua_State *l)
{
	int n = lua_gettop(l);/*获得lua调用时参数个数*/

	double sum = 0;

	for (int i = 1; i <= n; i++)
	{
		if (lua_isnumber(l, i))
		{
			sum += lua_tonumber(l, i);/*获得参数*/

		}
		else
		{
			lua_pushstring(l, "error not a number");
			return 1;
		}
	}

	lua_pushnumber(l, sum);/*返回给lua*/


	return 1;/*返回 返回值个数*/
}


int main()
{
	lua_State *l = lua_open();

	luaL_openlibs(l);

	lua_register(l, "get_sum", get_sum);


	luaL_dofile(l, "a.lua");

	lua_close(l);

	system("pause");
	return 0;
}

Lua 端:调用已注册的函数

在脚本文件 a.lua 中直接调用注册好的 get_sum。这里故意传入一个字符串 "3",用来观察 lua_isnumber 对字符串到数值自动转换的处理行为。

print("sum is "..get_sum(1,2,"3"))