Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
C++ 如何从C++;_C++_Lua - Fatal编程技术网

C++ 如何从C++;

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.

我想知道如何将属性公开给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.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++<代码>,与 C++ <代码> >相比,你可以考虑使用一个LuaAPI API。谢谢彼得。它帮助我更多地了解了lua以及如何在lua堆栈中推送元素。
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;