lua 中的 "dofile" 和 C API 中的 "luaL_dofile" 有什么区别?

What's the difference between "dofile" in lua and "luaL_dofile" in the C API?

使用 Lua 5.3.4 C API,这有效:

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

但是执行文件失败:

luaL_dofile(lua, "mnemonics.lua");

相反,它报告 "attempt to call a string value"。

当我将其替换为

luaL_loadfile(lua, "mnemonics.lua");

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

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

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