luaL_newlib# [-0, +1, e] void luaL_newlib (lua_State *L, const luaL_Reg l[]); 创建一张新的表,并把列表 l 中的函数注册进去。 它是用下列宏实现的: (luaL\_newlibtable(L,l), luaL\_setfuncs(L,l,0)) 数组l 必须是一个数组,而不能是一个指针。 luaL_newlib
不像Lua中的闭包,C闭包无法共享上值.但是我们可以把上值设置为一个公共的table,用来共享数据. luaL_newlib是一个这样的宏定义: #define luaL_newlib(L, lib) (LuaL_newlibtable(L, lib), LuaL_setfuncs(l, lib, 0)) 1. luaL_setfunc的最后一个参数可以指定栈上的上值个数,为所有函数添加上值. 创建一...
int luaopen_mylib(lua_State *L){ luaL_newlib(L, mylib); //5.2 ,创建(复用)一个table,并用数组ding_lib中的信息填充这个table //luaL_register(L, "lib",lib); // lua 5.1 return 1; //返回1,表示将这个table返回给Lua } //测试的功能函数 int show(char *str) { int ret = 0; if(str...
int luaopen_myLualib(lua_State *L) { luaL_Reg l[] = { { "test1", ltest1 }, { "test2", ltest2 }, { "test3", ltest3 }, { NULL, NULL }, }; luaL_newlib(L, l); return 1; } luaL_register现在已经弃用,取而代之的是luaL_newlib lua主程序: functiontest3( ... ) print("...
换句话说,一旦一个C函数完成注册,调用它时就不再依赖于其函数名、包的位置以及可见性规则。一个C模块中只有一个用于打开库的公共(外部)函数 ;其他所有的函数都是私有的。 (3)宏lual_newlib接收一个由 C函数及其对应函数名组成的数组,并将这些函数注册到一个新表中。
// luaL_openlib自动将该数组内的name-function对注册并填充到第二参数指定的table下 // nup : upvalue的个数,如果不为0,则注册的所有函数都共享这些upvalues luaL_openlib(L, "clib", l, 0); // 注册方式二: luaL_newlibtable + luaL_setfuncs (等价于lua_newlib) ...
luaL_newlib(L, mylib); return 1; } “` 上述代码中,首先定义了一个`execute`函数,该函数使用`system`函数执行传入的命令,并返回执行结果。然后定义了一个`mylib`数组,包含了要注册的函数。最后使用`luaL_newlib`函数创建一个新的Lua库,并将注册的函数加入到库中。
luaL_newlib(L, mydlllib);// 5.2之前使用luaL_register(L, "modulename", modulename); return1; } 得到的项目结构如下: 构建好LuaDll后,我们可以在其目录下,运行LuaInterpreter,在解释器中require,具体如下: 运行,得到结果如下: 我们观察它的输出,第一句是:“luaopen_LuaDll invoked”,这句话表明程序确实...
在协程中,Lua和C的调用顺序和栈管理有特殊规则,Lua 5.2引入的延续功能简化了这些问题。C模块则定义了主代码段来注册私有和公共C函数,通过lual_newlib宏来组织和注册这些函数。总的来说,C语言API是Lua可扩展性的重要组成部分,通过理解和掌握它,开发者可以更深入地利用Lua的功能。
luaL_newlib(L, l); return 1; } 以上,clone 这个 api 可以接收两个参数,第一个必须为一个 lua function ,第二个参数为 0 时,复制自身;为 1~n 时,以内部定义好的 prototype 来构建新的函数副本。 proto 可以返回函数的内部prototype 的指针,和 debug.upvalueid() 类似,它可以帮助你判断两个不同的函数...