Luajit
提供的FFI
库(ffi.*
)允许Lua
代码调用外部的C
函数和使用C
数据结构。但是默认情况下,FFI
库不会被加载和初始化。因此建议在每个使用FFI
库的Lua
文件开头加载:
local ffi = require("ffi")
看下面这个例子:
local ffi = require("ffi")
ffi.cdef[[
int printf(const char *format, ...);
]]
ffi.C.printf("Hello world!\n")
执行结果如下:
Hello world!
(1)
ffi.cdef
的定义如下:
ffi.cdef(def)
def
必须是一个Lua
字符串,建议使用“[[...]]
”这种格式。ffi.cdef
包含的是对C
语言类型的定义和外部符号(变量和函数)的声明(仅仅是声明,并没有和实际的内存地址进行绑定,实际的绑定是通过C library namespace
)。要注意对C
类型的声明不会经过C
预处理器,除了#pragma pack
以外,包括#define
在内的指令都要进行处理替换,比如使用enum
等等。
(2)
ffi.C
是默认的C library namespace
。它同编译器有些类似,但不用显示地声明链接库。在POSIX
系统上,ffi.C
会在default
或global
的namespace
上绑定符号。包括libc
,libm
,等等。还有Luajit
自身提供的API