我想require仅从C API 添加一个功能模块.
--lua.lua
local c_module = require("c_module")
c_module.doWork()
Run Code Online (Sandbox Code Playgroud)
我必须使用哪些API函数才能实现此功能?
当加载一个共享库时require,Lua会查找一个名为luaopen_<name>where的函数,其中<name>模块名称用下划线替换点(因此require "foo.bar"会查找luaopen_foo_bar,但连字符会得到特殊处理;请参阅Lua手册).
这个功能应该是常规的lua_CFunction; 也就是说,它需要一个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;
}
Run Code Online (Sandbox Code Playgroud)
(这适用于Lua 5.1,虽然5.2的等效代码应该非常相似,如果不相同的话.还要确保该luaopen_函数是从共享库中导出的.)
C loader的完整行为可以在这里找到:http://www.lua.org/manual/5.1/manual.html#pdf-package.loaders