我有一个创建 lua_State 并调用自定义 lua 代码的 C++ 程序。在调用自定义 lua 函数之前,使用 lua_State 调用 luaopen_ffi():
luaopen_ffi(lua_state_);
但是,当我的程序执行自定义lua代码时,找不到ffi。我进一步打印出 ffi 的值,遗憾的是它是 nil
:
print(ffi) --- which outputs nil
而使用 luaopen 加载的其他库确实有一个非零值,例如
print(io) --- outputs table: 0x400af268
我进一步查看了luaopen_ffi的源代码,它表示它不会根据其注释创建全局 ffi 命名空间:
LUALIB_API int luaopen_ffi(lua_State *L) {
CTState *cts = lj_ctype_init(L);
settabV(L, L->top++, (cts->miscmap = lj_tab_new(L, 0, 1)));
cts->finalizer = ffi_finalizer(L);
LJ_LIB_REG(L, NULL, ffi_meta);
/* NOBARRIER: basemt is a GC root. */
setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top-1)));
LJ_LIB_REG(L, NULL, ffi_clib);
LJ_LIB_REG(L, NULL, ffi_callback);
/* NOBARRIER: the key is new and lj_tab_newkey() handles the barrier. */
settabV(L, lj_tab_setstr(L, cts->miscmap, &cts->g->strempty), tabV(L->top-1));
L->top--;
lj_clib_default(L, tabV(L->top-1)); /* Create ffi.C default namespace. */
lua_pushliteral(L, LJ_OS_NAME);
lua_pushliteral(L, LJ_ARCH_NAME);
LJ_LIB_REG(L, NULL, ffi); /* Note: no global "ffi" created! */
ffi_register_module(L);
return 1;
}
我也试过 ffi = require("ffi")
但它不起作用 :(.
那么调用luaopen_ffi后我能知道如何使用ffi特性吗?还是 luaopen_ffi 方法不对?
最佳答案
如果你想要一个名为 ffi
的全局变量,试试这个:
luaopen_ffi(lua_state_);
lua_setglobal(lua_state_ ,"ffi");
似乎 luaopen_ffi
将表留在堆栈上,这在 Lua 模块中很常见。
关于c++ - 调用 luaopen_ffi 后找不到 ffi 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612349/