Lua 提供了调用 C 函数的接口,这样我们可以开心地用 C 来写一些底层的代码供 Lua 调用了。这里将整个流程整理一下。
1. 在 C 模块定义好函数
新建 C 源文件,将需要被 Lua 调用的函数实现一下,这里实现一个简单的传值函数。
/**
* 简单地对传入参数加 1,并返回结果
*/
int l_plus_one(lua_State *L)
{
// 获取函数参数:从栈底取一个参数
long long k = lua_tointeger(L, 1);
// 函数主体:做加 1 操作
++k;
// 函数结果返回:将结果压进栈顶
lua_pushinteger(L, k);
// 函数结果返回:表示在从栈顶算起,有 1 个值是返回值
return 1;
}
上面有几点需要注意
* 函数的原型是固定的:int (*l_func)(lua_State*)
* 返回类型为 int,表示在 lua 中调用该函数时获得的返回值个数
* 函数参数 lua_State,lua 和 C 通信时用到的上下文
* lua 模块在调用的 C 函数时,每一个函数都分配了一个在 C 和 Lua 之间传递参数的栈,用作参数和返回值传递用。
2. 在 C 模块导出该函数
假设我们的 C 模块文件名叫做 mylib
/**
* 函数集的结构体
*/
struct luaL_Reg funcs[] =
{
{ "plus_one", l_plus_one },
{ NULL, NULL }