我认为托鲁阿在工会方面存在缺陷如果你有这样的声明:

struct SDL_WindowEvent {
    int type;
    int windowID;
};

union SDL_Event {
    int type;
    SDL_WindowEvent window;
};

extern SDL_Event * create(void);
extern void frobnicate(SDL_Event *);

那么像这样的lua代码应该没问题:
event = create()
frobnicate(event)
print(event.window.windowId)
frobnicate(event)

但第二次调用frobnite(event)将失败,并出现错误:
argument #1 is 'SDL_WindowEvent'; 'SDL_Event' expected.

稍微戳一下调试器就会发现event.window access中的tolua_pushusertype重写了我的变量类型!
以下是我目前所做的尝试:在我的声明中,tolua将创建以下调用来声明SDL_WindowEvent类:
tolua_cclass(tolua_S,"SDL_WindowEvent","SDL_WindowEvent","",NULL);

从而使SDL_Event和SDL_WindowEvent成为两个不相关的类,而不是彼此的基类假设我后面有代码,相当于:
tolua_pushusertype(tolua_S, event, "SDL_Event");
assert(tolua_isusertype(tolua_S,1,"SDL_Event",0,&tolua_err));
tolua_pushusertype(tolua_S, event->window, "SDL_WindowEvent");
assert(tolua_isusertype(tolua_S,2,"SDL_Event",0,&tolua_err));

然后第四行的断言将失败,因为堆栈上的值在第二行的断言之后神奇地改变了类型这是因为tolua_pushusertype()更改了它-foo和foo.window具有相同的地址,并且在内部,tolua只跟踪每个地址的一种类型如果对象是基类型SDL_Event,则tolua_isusertype()将得到满足,但这将要求上面的tolua_cclass声明具有“SDL_Event”作为其第四个参数当我手动修复时,两个断言都通过,但我不能每次都手动更改-我想修复tolua来完成此操作,但我没有
要做到这一点,要充分理解它我甚至不知道这样做是否正确。
我使用的是tolua 5.1.4,但是tolua++1.92.3也出现了同样的问题。
首先,我做错了什么吗有没有办法我可以重写我的声明,让这项工作与托鲁阿是吗或者,如果失败了,我可以向托鲁亚申请一个解决方案,使之生效?

最佳答案

我想出来了解决方案是像这样编辑我的.pkg文件:

struct SDL_WindowEvent : SDL_Event {
    int type;
    int windowID;
};

这使得tolua的类层次结构显式化我太专注于.pkg内容是有效的C代码了,看起来是这样的。

关于c - 甲苯胺的 union 类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9450228/

10-11 19:41