FFI 基础:ffi.cdef 和 ffi.load
使用 LuaJIT 的 ffi 模块声明 C 类型并加载共享库。
FFI 基础:ffi.cdef 和 ffi.load 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
什么是 FFI?
LuaJIT 的 FFI(外部函数接口)允许您直接从 Lua 调用 C 库函数并使用 C 数据结构,无需编写 C 包装代码。
引入 FFI
使用 require("ffi") 加载 FFI 库。它内置于 LuaJIT 中,在标准 PUC Lua 中不可用。
local ffi = require("ffi")ffi.cdef:声明 C 类型
ffi.cdef(cDeclarations) 会解析 C 声明,并使类型和函数签名可供 FFI 使用。它不会编译实际代码,只提供类型信息。
ffi.cdef[[
int printf(const char *fmt, ...);
double sqrt(double x);
typedef struct { int x; int y; } Point;
]]ffi.load:加载共享库
ffi.load(libname) 会加载共享库,并返回一个对象,其字段就是已声明的 C 函数。
local C = ffi.C -- access to libc on POSIX
local m = ffi.load("m") -- libm
print(m.sqrt(2.0)) -- 1.414...直接访问 libc 函数
在 POSIX 系统上,ffi.C 无需显式加载即可提供对所有标准 C 库函数的访问。
ffi.cdef[[ int puts(const char *s); ]]
ffi.C.puts("Hello from C!")ffi.load 路径
传入完整路径或标准库名称。在 Linux 上,使用 "m" 表示 libm.so,使用 "pthread" 表示 pthreads,依此类推。
声明结构体
在 cdef 中声明 C 结构体,然后从 Lua 中分配并访问它们。
ffi.cdef[[
typedef struct { float x, y, z; } Vec3;
]]
local v = ffi.new("Vec3", {1, 2, 3})
print(v.x, v.y, v.z) -- 1.0 2.0 3.0类型注解与限定符
cdef 支持 const、unsigned、int32_t、uint64_t 以及其他标准 C 类型。
多次调用 cdef
您可以多次调用 ffi.cdef。重复的声明会被忽略。通常可以按库组织这些声明。
平台差异
结构体布局和函数签名可能因平台而异(Windows 与 Linux、32 位与 64 位)。请使用 ffi.os 和 ffi.arch,有条件地声明正确的签名。
安全提示
FFI 会绕过 Lua 的类型安全机制。错误的 C 声明会导致内存损坏、段错误或未定义行为。请始终对照实际的 C 头文件仔细检查声明。
FFI 基础问题
ffi.cdef 的作用是什么?
回顾:FFI 基础
使用 ffi.cdef 声明 C 类型和函数,使用 ffi.load 加载共享库。ffi.C 提供对 libc 的直接访问。请始终确认声明与实际 C 头文件一致,以避免内存损坏。
常见问题解答
「FFI 基础:ffi.cdef 和 ffi.load」课时是免费的吗?
是的 — 「FFI 基础:ffi.cdef 和 ffi.load」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「FFI 基础:ffi.cdef 和 ffi.load」这节课中我会学到什么?
使用 LuaJIT 的 ffi 模块声明 C 类型并加载共享库。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「FFI 基础:ffi.cdef 和 ffi.load」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- FFI 基础:ffi.cdef 和 ffi.load
- 通过 FFI 调用 C 函数
- FFI 中的指针、结构体和数组
- 回调:将 Lua 函数传递给 C