【发布时间】:2013-02-08 22:24:27
【问题描述】:
假设我有一个来自 C 端的指针,我希望以用户数据的形式将它推入 Lua 堆栈。在不牺牲指定特定元表的能力的情况下,最好的方法是什么?
我最初的想法是使用轻量级用户数据,但从我读过的here 来看,所有轻量级用户数据共享一个公共元表。这是不可取的,因为它会强制我所有的 c 面对象都采取共同的行为。
考虑到我希望为 Lua 分配的对象重用元表,只需将不同的 this 指针传递给元方法,我的第二个想法是将人工 this 指针附加到 userdata 对象。
struct ud
{
struct T* ptr;
struct T data;
};
struct ud* p = (struct ud*)lua_newuserdata(L, sizeof(struct ud));
p->ptr = &(p->data);
或者,在推送轻量用户数据的情况下
struct T object;
struct T** p = (struct T**)lua_newuserdata(L, sizeof(struct T*));
*p = &object;
是否推荐附加 this 指针,或者是否有更 API 友好的替代方案?我的最终目标是简单地将现有指针推送到 Lua,并将元表与它关联,这样元表可以被重用和轻量用户数据重用。
【问题讨论】:
-
你不能用
void*s 做指针运算。那么您究竟希望您的第一个代码示例做什么? -
那是我的一个错误。我忘记了指针算术在 void* 上是非标准的。目的是将 this 指针附加到 userdata,然后是结构本身。然后,将 this 指针设置为紧随其后的位置,我希望在该位置分配结构。我将编辑我的代码以以标准方式反映这一点。