假設我有一個從C端擁有的指針,我希望以用戶數據的形式推入到Lua棧中。在不犧牲指定特定metatable的能力的情況下,完成此操作的最佳方法是什麼?Lua C API推送現有的指針
我最初的想法是使用一個light userdata,但是從我讀的here中,所有light userdatas都共享一個metatable。這是不可取的,因爲它會強制所有我的c面對象的共同行爲。
考慮到我希望爲Lua分配的對象重用元表,只需將一個不同的指針傳遞給元方法,我的第二個想法就是將一個人爲的指針附加到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;
的情況下,附加該指針推薦的,還是有更多的API友好的替代?我的最終目標是簡單地將現有指針推送到Lua,並將元數據與它相關聯,以便metatable可以重複用於重和輕userdatas。
你不能用'void *'s做指針運算。那麼你究竟想要你的第一個代碼示例要做什麼? – 2013-02-23 09:44:38
這是我的錯誤。我忘記了void *上的指針算術是非標準的。目的是將這個指針附加到用戶數據,然後是結構本身。然後,將這個指針設置到它自己後面的位置,我期望結構被分配。我將編輯我的代碼,以標準方式反映出來。 – TheCodeBroski 2013-02-23 09:50:01