如何将 lua 字符串转换为 C char*?

How do I convert a lua string to a C char*?

我已经使用 luajit ffi 库包装了一个 C 库,该库包含在 ppm 文件上绘制文本的函数:

void drawText(frameBuffer *fb, int px, int py, char* text, pixel color) 

当我尝试使用字符串从 lua 调用它时,出现此错误 bad argument #4 to 'drawText' (cannot convert 'string' to 'char *')。看起来 lua 字符串库没有任何东西可以将整个字符串转换为字节数组或任何我可以充分操作的东西。

关于如何在不修改 C 代码的情况下在 lua 方面执行此操作的任何提示?

您不能将 Lua string 直接传递给需要 char* 的 ffi 函数。您需要先将 Lua string 转换为 char* 。为此,使用 ffi.new 创建一个新的 C string 变量,然后复制 Lua string 的内容变量到这个新的 C string 变量。例如:

local text = "text"
-- +1 to account for zero-terminator
local c_str = ffi.new("char[?]", #text + 1)
ffi.copy(c_str, text)
lib.drawText(fb, px, py, c_str, color)

或者,重写您的 C 函数以接受 const char* 而不是 char*。然后就可以直接使用LuaJIT字符串了,不需要先为它们分配缓冲区

这意味着该函数无法修改传递的字符串,但您通常不会在大多数函数中这样做。如果您希望传入字符串文字(因为它们属于 const char* 类型),那么在较新版本的 C 中也需要它,否则就需要很好的 API 设计。

转换记录在 Conversion from Lua objects to C types of the FFI Semantics page