Luajit ffi如何调用time.h中的函数?

Luajit ffi how to call funcitons in time.h?

我试过用这种方式调用 math.h 的函数 tan(直接复制声明)并且有效:

local ffi = require("ffi")
ffi.cdef[[
    double tan(double x);
]]
print(ffi.C.tan(45))

但是当我试图以同样的方式调用time.h的函数localtime时:

local ffi = require("ffi")
ffi.cdef[[
    struct tm *localtime(const time_t *tp);
]]
print(ffi.C.localtime(1234544))

并得到错误:

lua: C:\Users\xiang\Desktop\bm.lua:4: declaration specifier expected near 'time_t'
stack traceback:
    [C]: in function 'cdef'
    C:\Users\xiang\Desktop\bm.lua:4: in main chunk
    [C]: at 0x00401f00
[Finished in 0.1s with exit code 1]

我已经查看了官方手册this and this,但仍然一头雾水。

您不能使用 time_t,因为它不是原生 C 类型。将其替换为适当的本机类型或使用相应的 struct typedef。然后它应该工作。

你想从 FFI 调用的每个函数,都需要先定义。如果不是 LuaJIT 不会如何解析 FFI 函数调用,如何进行从 Lua 到 C(反之亦然)的数据类型转换等

记住这一点,要使您的代码正常工作,您需要定义 time_tstruct tmtime_t 一般定义为有符号整数。您可以在 localtime 文档中找到 struct tm 的定义 (man localtime).

ffi.cdef[[
   struct tm {
      int tm_sec;    /* Seconds (0-60) */
      int tm_min;    /* Minutes (0-59) */
      int tm_hour;   /* Hours (0-23) */
      int tm_mday;   /* Day of the month (1-31) */
      int tm_mon;    /* Month (0-11) */
      int tm_year;   /* Year - 1900 */
      int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
      int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
      int tm_isdst;  /* Daylight saving time */
   };
   struct tm *localtime(const int32_t *tp);
]]

此外,函数localtime需要一个指针值,而不是一个常数整数。因此,有必要将存储整数的 c 数据指针传递给 localtime。有一种 LuaJIT 惯用法。

local time = ffi.new("int32_t[1]")
time[0] = 1234544
local tm = C.localtime(time)

因为 C 中的数组和指针虽然不完全相同,但在大多数情况下是可以互换的。

最后,不能直接打印struct tm。应该将其存储到一个变量中并打印出您感兴趣的字段。

print(tm.tm_sec)