0Pricing
Lua Academy · 课时

在 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Lua C API 的栈模型
  2. 从 C 调用 Lua 函数
  3. 在 Lua 中注册 C 函数
  4. 管理状态和错误处理
← 返回 Lua Academy