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]
您不能使用 time_t
,因为它不是原生 C 类型。将其替换为适当的本机类型或使用相应的 struct typedef。然后它应该工作。
你想从 FFI 调用的每个函数,都需要先定义。如果不是 LuaJIT 不会如何解析 FFI 函数调用,如何进行从 Lua 到 C(反之亦然)的数据类型转换等
记住这一点,要使您的代码正常工作,您需要定义 time_t
和 struct tm
。 time_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)
我试过用这种方式调用 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]
您不能使用 time_t
,因为它不是原生 C 类型。将其替换为适当的本机类型或使用相应的 struct typedef。然后它应该工作。
你想从 FFI 调用的每个函数,都需要先定义。如果不是 LuaJIT 不会如何解析 FFI 函数调用,如何进行从 Lua 到 C(反之亦然)的数据类型转换等
记住这一点,要使您的代码正常工作,您需要定义 time_t
和 struct tm
。 time_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)