C++ 如何从C++;
我想知道如何将属性公开给lua库C++ 如何从C++;,c++,lua,C++,Lua,我想知道如何将属性公开给lua库 luaL_openlib( L, kName, kVTable, 1 ); // leave "library" on top of stack 这样,我就可以只公开kVTable引用luaL_Reg时的函数 typedef struct luaL_Reg { const char *name; lua_CFunction func; } luaL_Reg; 用上面的代码。我能做到以下几点 local myLib = require "plugin.
luaL_openlib( L, kName, kVTable, 1 ); // leave "library" on top of stack
这样,我就可以只公开kVTable引用luaL_Reg时的函数
typedef struct luaL_Reg {
const char *name;
lua_CFunction func;
} luaL_Reg;
用上面的代码。我能做到以下几点
local myLib = require "plugin.myLib"
myLib.newFunc();
但是,我想将Lua表作为常量变量公开给库
myLib.CONSTANTS.SOME_CONST_1
myLib.CONSTANTS.SOME_CONST_2
请让我知道如何将LUA表从我的库中暴露为属性。< /P> < P>如果使用C++,您可以使用绑定库(如头)将一些数据绑定到Lua中的命名表。将示例转换为LuaBridge,在初始化Lua状态后调用此函数:
void register_constants (lua_State* L) {
luabridge::getGlobalNamespace(L)
.beginNamespace("myLib")
.beginNamespace("CONSTANTS")
.addVariable("SOME_CONST_1",&some_const_1,false/*read-only*/)
.addVariable("SOME_CONST_2",&some_const_2,false/*read-only*/)
.endNamespace()
.endNamespace()
;
}
您可以将这些常量作为最后一个代码片段来访问,因为luaapi就是capi
loadlib
和friends的全部负担是因为使用C传递函数要困难得多(C函数不是第一类值)。因此,我最好的办法是使用常规堆栈API设置所有这些常量
一般来说,它应该用来交换运行时数据,当然,但没有内在的原因说明在加载模块时不能用这些数据填充表。由于
luaL\u openlib
将库表放在堆栈顶部,您可以使用常规的C API向其添加新字段和子表:
luaL_openlib( L, kName, kVTable, 1 ); // leaves "library" on top of stack
lua_pushstring(L, "CONSTANTS");
lua_newtable(L); // this will be CONSTANTS subtable
lua_pushstring(L, "SOME_CONST_1");
lua_pushnumber(L, 42); // SOME_CONST_1 value
lua_settable(L, -3); // sets SOME_CONST_1
lua_pushstring(L, "SOME_CONST_2");
lua_pushnumber(L, 12345); // SOME_CONST_2 value
lua_settable(L, -3); // sets SOME_CONST_2
lua_settable(L, -3); // sets CONSTANTS table as field of the library table
return 1;
您使用哪个版本的Lua?在Lua5.1中删除了AFAIK luaL_openlib。@peterm我正在使用CORONA Enterprise。从头文件中,我可以看到它们使用的是Lua5.1。从Lua5.1手册中可以看出,函数luaL_openlib被luaL_寄存器取代。luaL_寄存器还接受luaL_Reg的数组,这意味着我只能将带有键(字符串)和值的表作为cffunction传递。我甚至希望将表设置为值。@kapser如果您要从
C
公开一组非常有限的API,您可以使用@peterm建议的方法。但是对于更广泛的东西(特别是如果是代码> C++<代码>,与luaL_openlib( L, kName, kVTable, 1 ); // leaves "library" on top of stack
lua_pushstring(L, "CONSTANTS");
lua_newtable(L); // this will be CONSTANTS subtable
lua_pushstring(L, "SOME_CONST_1");
lua_pushnumber(L, 42); // SOME_CONST_1 value
lua_settable(L, -3); // sets SOME_CONST_1
lua_pushstring(L, "SOME_CONST_2");
lua_pushnumber(L, 12345); // SOME_CONST_2 value
lua_settable(L, -3); // sets SOME_CONST_2
lua_settable(L, -3); // sets CONSTANTS table as field of the library table
return 1;