第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目


26 – 从 Lua 调用 C

扩展 Lua 的基本方法之一是让应用程序将新的 C 函数注册到 Lua 中。

当我们说 Lua 可以调用 C 函数时,这并不意味着 Lua 可以调用任何 C 函数。(有一些程序包允许 Lua 调用任何 C 函数,但它们既不可移植也不健壮。)正如我们之前看到的,当 C 调用 Lua 函数时,它必须遵循一个简单的协议来传递参数并获取结果。类似地,要从 Lua 调用 C 函数,它必须遵循一个协议来获取其参数并返回其结果。此外,要从 Lua 调用 C 函数,我们必须注册它,也就是说,我们必须以适当的方式向 Lua 提供其地址。

当 Lua 调用 C 函数时,它使用与 C 调用 Lua 相同类型的堆栈。C 函数从堆栈中获取其参数,并将结果推送到堆栈中。为了将结果与堆栈上的其他值区分开来,该函数在 C 中返回它留在堆栈上的结果数。这里的一个重要概念是堆栈不是一个全局结构;每个函数都有自己私有的本地堆栈。当 Lua 调用 C 函数时,第一个参数始终位于此本地堆栈的索引 1 处。即使 C 函数调用再次调用相同(或其他)C 函数的 Lua 代码,这些调用中的每一个也只会看到其自己的私有堆栈,其第一个参数位于索引 1 处。