【问题标题】:What's the difference between "dofile" in lua and "luaL_dofile" in the C API?lua 中的“dofile”和 C API 中的“luaL_dofile”有什么区别?
【发布时间】:2017-07-21 07:46:01
【问题描述】:

使用 Lua 5.3.4 C API,这是可行的:

luaL_dostring(lua, "dofile('mnemonics.lua')");

但这无法执行文件:

luaL_dofile(lua, "mnemonics.lua");

相反,它报告“尝试调用字符串值”。

当我用

替换它时
luaL_loadfile(lua, "mnemonics.lua");

它返回LUA_OK,但它不会像预期的那样将函数压入堆栈。事实上,之后堆栈是空的(gettop 报告 0)。

我可以使用 dostring 解决方法,但要么我遗漏了什么,要么存在错误。

【问题讨论】:

  • 这真的很奇怪。一个疯狂的猜测:你的 C 代码中早先发生的事情破坏了你的lua 状态?尝试使用 Valgrind 运行程序。
  • 你能给我们展示一个最小的例子来重现你所看到的问题,因为我做不到。
  • 在寻找一个最小的例子时,我发现问题是由于试图弹出一个空堆栈引起的。我误解了调用lua_settable 的行为。我相信 Lua 命令在 C API 命令不起作用时起作用的原因是堆栈在 C 代码和 Lua 代码之间的转换时被清理。

标签: c lua lua-api


【解决方案1】:

从空堆栈弹出会导致意外行为。 Lua 解释器在执行 C 代码和执行 Lua 代码之间清理堆栈,因此混乱的堆栈不会影响 Lua 中的dofile

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 2021-04-16
    • 2020-06-18
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2016-08-15
    相关资源
    最近更新 更多