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