luaopen函数

我在 lua 示例代码中发现了下面这些调用:

luaopen_table(L);
luaopen_io(L);
luaopen_string(L);
luaopen_math(L);

我在 lua 头文件中搜索时,发现了其他带有 luaopen 的函数:

LUALIB_API int (luaopen_base) (lua_State *L);
LUALIB_API int (luaopen_table) (lua_State *L);
LUALIB_API int (luaopen_io) (lua_State *L);
LUALIB_API int (luaopen_os) (lua_State *L);
LUALIB_API int (luaopen_string) (lua_State *L);
LUALIB_API int (luaopen_math) (lua_State *L);
LUALIB_API int (luaopen_debug) (lua_State *L);
LUALIB_API int (luaopen_package) (lua_State *L);

请问这些函数的意义是什么?例如,如果我不调用 luaopen_table,那么我能否使用表呢?我没有找到任何有关这方面的文档!

原文链接 https://stackoverflow.com/questions/5242958

点赞
stackoverflow用户565840
stackoverflow用户565840

如果你正在使用最新版本的 Lua 5.1,参考手册中有一个答案:

要使用这些库,C 主程序应该调用 luaL_openlibs 函数,该函数打开所有标准库。或者,它可以通过调用 luaopen_base(基本库),luaopen_package(包库),luaopen_string(字符串库),luaopen_table(表库),luaopen_math(数学库),luaopen_io(I/O 库),luaopen_os(操作系统库)和 luaopen_debug(调试库)来逐个打开它们。这些函数在 lualib.h 中声明,不应该直接调用:你必须像调用其他 Lua C 函数一样调用它们,例如使用 lua_call。

[...]

luaopen_* 函数(用于打开库)不能像常规 C 函数那样直接调用。它们必须通过 Lua,如同调用 Lua 函数一样调用。

是的,如果你没有导入表库,你仍然可以使用表格,因为它们是内置的。你仅仅无法访问表操作函数

2011-03-09 08:37:37
stackoverflow用户804870
stackoverflow用户804870

您需要将它们推入堆栈,以便像调用普通 Lua C 函数一样调用它们。

lua_State *l = lua_open();
lua_pushcfunction(l,luaopen_base);
lua_call(l,0,0);
lua_pushcfunction(l,luaopen_math);
lua_call(l,0,0);
lua_pushcfunction(l,luaopen_string);
lua_call(l,0,0);
lua_pushcfunction(l,luaopen_table);
lua_call(l,0,0);
2011-06-18 21:12:03
stackoverflow用户264751
stackoverflow用户264751

对于那些正在查找如何在现代 Lua 中使用这些函数的人:

从 Lua 5.3 开始,您需要luaL_requiref这些函数,基于 luaL_openlibs 中的源代码。我在任何手册中都没有找到这方面的参考。这里是一个示例,仅打开允许 Lua 向标准输出print的基本库。

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int main( int argc, char *argv[] ) {

  lua_State *lua = luaL_newstate();
  luaL_requiref( lua, "_G", luaopen_base, 1 );
  lua_pop( lua, 1 );

  luaL_dostring( lua, "print \"Hello, lua\"" );

  lua_close( lua );

  return 0;
}

我无法确定所有这些库的确切含义,以及不加载它们会对您产生什么影响,但您可以使用上述示例单独加载它们。例如,

luaL_requiref( lua, LUA_IOLIBNAME, luaopen_io, 1 );
lua_pop( lua, 1 );

将仅加载 I/O 库。另请参见手册

2019-07-24 19:40:35