c 向Lua中傳遞複雜的結構該如何做?

時間 2021-05-29 23:42:22

1樓:Xi Yang

把每個需要訪問的成員的型別都包裝乙個lua型別,然後把成員名包裝成訪問函式。

最好把所有需要暴露的型別都做成內嵌引用計數的,這樣能夠以最自然的方式同時管理好指令碼端和宿主端的物件所有權。

另外,Perl有magic機制,讓你在Perl端用下標訪問obj->的時候,實際上是在呼叫訪問函式。不知道Lua有沒有類似的機制。

2樓:彭愛峰

idlcpp : C++混合程式設計輔助工具, 方便將C++功能匯出到指令碼語言如Lua,Python中使用,本人作品,詳見 Kunana - 部落格園

3樓:

對於結構體,用 struct 庫,將資料 pack 到 string。lua 5.3 中已經加入到內建的 string 庫中。

對於類,用 userdata + 元表。

4樓:hillin

如果在應用中這種需求比較頻繁,你需要使用乙個lua binder。

Binder的作用就是將宿主語言的資料報裝成Lua可訪問的物件(table或userdata)。

5樓:

用userdata, 參考 Programming in Lua : 28.1

還可以考慮直接ffi,參考FFI Tutorial

6樓:

我自己實現了乙個C++的reflection機制,然後自動轉化成表傳過去。在lua中, map, array, object是同一類東西,都可以用表來表示。

當然如果你的資料結構比較大,而每次同步的部分資料量又比較少,直接用metatable 將乙個C++物件域對映到lua的元方法上就好了。

思路:由於C++沒有原生的反射機制,所以你得照樣子去做乙個。舉個例子,你有個類A:

class A : public LuaObject ;

void A::RetriveAllMethods(luaState* L)

其中RegisterMember可以這樣實現:

#define RegisterMember(name) \

_Register(L, this, &name, #name);

然後:template

struct Proxy

};// 每個LUA支援的原生型別都寫個

template <>

struct Proxy

}// 最後

template

void _Register(lua_State* L, T* object, P* member, const char* name)

lua呼叫c庫中stub是什麼?

acebear 不用想得太複雜,其實挺樸素的東西。但跨語言的呼叫,還要解決另外乙個麻煩 確保對引數理解一致。我們用最常見的字串來說明一下 比如,C,字串是以ASCII編碼每個字元 8bits 最後以乙個字元 8bits 0作為結尾。而另乙個語言,它的字串極有可能是另外的結構,比如可能是以unicod...

如何無效能消耗地在C 中實現類似lua的ipairs?

鹹蛋 要是為了編碼方便可以先實現tuple的迭代器然後用巨集封裝下for迴圈比較容易實現 define for i,a,b for auto i a i b i 可以進一步為 for 加上變參控制實現類似包含預設值的巨集手機不方便碼字 stackoverflow和知乎上可以搜到 Star.E 雖然解...

lua和C 誰呼叫誰好一些

徐波 兩種寫法都有,看你怎麼設計,不限於lua.js,python都可以 主c 指令碼為輔 核心戰鬥仍然C 只是需要熱更的養成或公式使用指令碼,這種方式適合對效能要求的較高的型別,例如 MMO,MOBA等 2.主指令碼,C 打底 核心戰鬥使用指令碼,只有網路,通訊使用C 保證效能,這種方式適合棋牌,...