如何将值类型存储在userdata中?

这篇 StackOverflow 文章是相同的事情,但是回答并没有帮助,因为回答是关于 Lua 的,而问题是关于 C-API 的。所以我再问一遍。希望其他人能从这个问题中受益。

我实际上有两个问题(我无法让 y 和 z 起作用,也无法让 helloworld() 起作用)

我想得到这个:

local x = MyCBoundLib.GetSomething()
print(x.y)
print(x.z)

其中 x 是一个 userdata。我一直得到 attempt to index a userdata value

我知道 " userdata isn't indexable without a metatable because it's C/C++ data"

在我的 C 代码中,我尝试这样做来尝试包装对象。

int push_Something(lua_State *L, void *object)
{
    struct SomethingWrapper *w = (struct SomethingWrapper *)lua_newuserdata(L, sizeof(struct SomethingWrapper));
    w->object = object;

    luaL_setmetatable(L, "Something");
    return 1;
}

早些时候,我尝试注册一个叫做 Something 的元表,像这样:

luaL_newmetatable(L, "Something");
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
luaL_setfuncs(L, some_funcs, 0);
lua_pop(L, 1);

其中 some_funcs 有:

static luaL_Reg const some_funcs [] =
{
    { "helloworld",     l_helloworld },
    { NULL, NULL }
};

如果我尝试 print(x.helloworld()),我会得到同样的错误:attempt to index a userdata value

在我的代码中,我不知道该如何正确地附加值类型 yz

点赞