c++ - 调用 luaopen_ffi 后找不到 ffi 命名空间

标签 c++ lua

我有一个创建 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/

相关文章:

c++ - 找不到命令

c++ - va_copy -- 移植到 Visual C++?

c++ - 为什么不能在 C++ 模板参数中定义新类型?

lua - 设置私有(private) luarocks 存储库

Lua 表长度函数覆盖不起作用

c++ - 不能在 lua 脚本中要求 luacom 库

c++ - Windows 上的实际 C++ 程序内存布局(VS2010)

c++ - 将两个或多个互斥量应用于一段代码

android - Corona newScrollView hideScrollBar 仍然显示滚动条

.net - 在继续响应用户输入和渲染帧之前等待 x 秒