从Lua调用C嵌套函数指针

时间:2016-05-04 08:28:08

标签: c pointers lua ffi

我有以下C结构,包含函数指针:

struct db {
    struct db_impl *impl;
    void (*test)(struct db *self); // How to invoke it from Lua??
};
void (*db_test)(void); // this I can invoke from Lua

struct db * get_db() {
    // create and init db
    struct db * db = init ...
    db->test = &db_real_impl; // db_real_impl is some C function
    return db;
}

因此初始化后的测试函数指针指向某些函数。 现在我需要使用FFI库从Lua调用该函数,但它失败并出现错误:'void' is not callable

local db = ffi.C.get_db()
db.test(db)  -- fails to invoke
-- Error message: 'void' is not callable

ffi.C.db_test()  -- this works fine

在C中,代码为:

struct db *db = get_db();
db->test(db);

在Lua中我可以轻松地调用自由函数指针,但不能从struct调用函数指针。如何从Lua调用它?

1 个答案:

答案 0 :(得分:2)

似乎在以下方面指出了一个解决方案: http://lua-users.org/lists/lua-l/2015-07/msg00172.html

ffi.cdef[[
    typedef void (*test)(struct db *);
]]

local db = get_db()
local call = ffi.cast("test", db.test)
call(db)