Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置一个";要求;要从LUACAPI返回表/模块?_C_Lua - Fatal编程技术网

如何设置一个";要求;要从LUACAPI返回表/模块?

如何设置一个";要求;要从LUACAPI返回表/模块?,c,lua,C,Lua,我想仅从C API添加一个requireable模块 --lua.lua local c_module = require("c_module") c_module.doWork() 要实现这一点,我必须使用哪些API函数?当加载带有require的共享库时,Lua会查找名为luaopen\uuu的函数,其中是模块名称,点替换为下划线(因此需要“foo.bar”)将查找luaopen\u foo\u bar,但连字符会得到特殊处理;请参阅Lua手册) 此函数应为常规的lua_cf函数;也就是说

我想仅从C API添加一个
require
able模块

--lua.lua
local c_module = require("c_module")
c_module.doWork()

要实现这一点,我必须使用哪些API函数?

当加载带有
require
的共享库时,Lua会查找名为
luaopen\uuu
的函数,其中
是模块名称,点替换为下划线(因此
需要“foo.bar”)
将查找
luaopen\u foo\u bar
,但连字符会得到特殊处理;请参阅Lua手册)

此函数应为常规的
lua_cf函数
;也就是说,它将
lua_State*
作为参数,并返回
int
require
使用包名作为参数调用此函数,从函数返回的值是
require
存储和返回的值

下面是一个名为
foo
的模块示例:

static int bar(lua_State* L) {
    // ...
}

int luaopen_foo(lua_State* L) {
    lua_newtable(L); // Create package table

    // Push and assign each function
    lua_pushcfunction(L, &bar);
    lua_setfield(L, -2, "bar");

    // ...

    // Return package table
    return 1;
}
(这是针对Lua 5.1的,尽管5.2的等效代码应该非常相似,如果不相同的话。还要确保从共享库导出
luaopen_uuu
函数。)


C加载器的完整行为可以在这里找到:

如果没有单独的库名为
foo.so/.dll
,函数luaopen\u foo必须注册为cclosure作为
package.preload.foo
。这很简单:
lua_getglobal(l,“包”);lua_推进管柱(l,“预加载”);lua_可得(l,-2);lua_-pushcclosure(l,luaopen_检验,0);lua_设定域(l,-2,“测试”);lua_settop(l,0)。这样就可以直接在主程序中定义它。@Appleshell:或者,如果您不介意也执行
luaopen_test()
,您可以使用Lua 5.2的
luaL_requiref()
,它将模块存储在
packae.loaded[modname]
中。