在 Lua 中注册 C 函数
使用 luaL_register 和 lua_pushcfunction 向 Lua 脚本公开 C 函数。
在 Lua 中注册 C 函数 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
概述
C 函数可以暴露给 Lua 脚本。它们必须具有签名 int myFunc(lua_State *L)。它们从栈中读取参数,并压入返回值。
C 函数签名
每个可由 Lua 调用的函数都是一个 lua_CFunction:它接收一个 lua_State*,读取参数,压入结果,并返回结果数量。
// C code
static int l_add(lua_State *L) {
double a = luaL_checknumber(L, 1);
double b = luaL_checknumber(L, 2);
lua_pushnumber(L, a + b);
return 1; // one result
}注册为全局函数
lua_pushcfunction(L, l_add) 将 C 函数压入栈中,然后 lua_setglobal(L, "add") 将其注册为 Lua 中的全局函数。
// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)luaL_newlib / luaL_register
使用 luaL_Reg 数组和 luaL_newlib,将一组 C 函数注册为 Lua 模块。
// C code
static const luaL_Reg mylib[] = {
{"add", l_add},
{"mul", l_mul},
{NULL, NULL}
};
luaL_newlib(L, mylib);
lua_setglobal(L, "mylib");
// Lua: mylib.add(1, 2)读取参数
luaL_checknumber(L, n)、luaL_checkstring(L, n) 等函数会读取并验证参数;如果类型不正确,则引发 Lua 错误。
返回多个值
压入多个值并返回它们的数量。Lua 会将它们作为多个返回值进行赋值。
// C code
static int l_divmod(lua_State *L) {
int a = luaL_checkinteger(L, 1);
int b = luaL_checkinteger(L, 2);
lua_pushinteger(L, a / b);
lua_pushinteger(L, a % b);
return 2; // two results
}C 闭包的上值
C 闭包会在注册时使用 lua_pushcclosure(L, fn, n) 捕获上值。使用 lua_upvalueindex(n) 访问上值。
从 C 报告错误
调用 luaL_error(L, format, ...),即可从 C 函数引发 Lua 错误。该调用永远不会返回,而是通过 longjmp 跳转到受保护的调用处理器。
// C code
if (divisor == 0)
luaL_error(L, "division by zero at argument %d", 2);作为 .so/.dll 的 C 模块
C 模块会暴露一个 luaopen_modname 函数。Lua 的 require 会加载共享库,并调用该函数初始化模块。
// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
luaL_newlib(L, mymod_funcs);
return 1;
}检查参数数量
使用 lua_gettop(L) 检查传入的参数数量。luaL_checkany(L, n) 确保至少传入了 n 个参数。
LuaJIT FFI 替代方案
LuaJIT 的 FFI 允许您直接从 Lua 调用 C 函数,而无需编写 C 包装代码。对于纯函数调用,这通常更简单。进行更深入的集成时则需要使用 C API。
C 函数问题
可由 Lua 调用的 C 函数必须返回什么?
回顾:注册 C 函数
可由 Lua 调用的 C 函数具有签名 int f(lua_State*)。使用 luaL_check* 读取参数,压入结果,并返回结果数量。可以使用 lua_pushcfunction 逐个注册,也可以使用 luaL_newlib 批量注册。
常见问题解答
「在 Lua 中注册 C 函数」课时是免费的吗?
是的 — 「在 Lua 中注册 C 函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「在 Lua 中注册 C 函数」这节课中我会学到什么?
使用 luaL_register 和 lua_pushcfunction 向 Lua 脚本公开 C 函数。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「在 Lua 中注册 C 函数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Lua C API 的栈模型
- 从 C 调用 Lua 函数
- 在 Lua 中注册 C 函数
- 管理状态和错误处理