下面通过一个简单的例子演示如何让 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"))