2011-12-06 52 views
9

我在Lua很新,我想用Lua嵌入我們的遊戲項目。我注意到的第一件事,Lua被允許編譯爲C++代碼,並且從文檔中,我瞭解到,這將消除Lua頭文件中的'extern C'包裝,並且錯誤處理將是C++異常,而不是跳遠踏板/ setjump。將Lua編譯爲C++除了避免'extern C'並獲得'C++異常'之外,還有什麼好處?

我的問題是,除了這兩個區別之外,還有沒有其他真正的好處將Lua代碼編譯爲C++代碼?這兩個並不真正說服我,因爲,1)它不打擾我用'extern C'封裝c頭文件,2)我們的項目不允許異常,所以我必須在luaconf.h中更改以使用longjump/setjump任何方式。

回答

9

那些將Lua編譯爲C++的好處。事情並不是真的重點;這都是關於異常處理的。儘管您的應用程序禁止異常,但並非每個C++應用程序都會這樣做。如果你使用的是的所有 C++,你必須採取措施防止異常通過Lua(不是世界上最簡單的東西,除非你使用像Luabind這樣的包裝)或者編譯Lua作爲C++。

將Lua編譯爲C++沒有其他好處。異常處理 Lua可以編譯爲C++的原因。

+1

此外:「不允許異常」可解釋兩種方式。 1.沒有用戶代碼可以拋出異常,或者2.您編譯時禁用了異常。不同之處在於許多標準的東西會在case 1中拋出異常(如new)。在這些情況下,如果其中一個異常觸及lua C-C++邊界,則可能會出現「奇怪」的行爲。 –

+0

@MichaelAnderson:沒錯,但是如果沒有用戶代碼拋出異常,用戶代碼*也不會捕獲它們。這意味着'std :: bad_alloc'只會冒泡過去並終止應用程序。在這種情況下,堆棧甚至不放鬆。 –

+0

@NicolBolas:謝謝你的解釋。正如你所說的,我們禁止在用戶代碼中使用**異常,並且我們已經讓Google Breakpad捕獲所有未處理的異常,並讓我們的遊戲終止。這就是爲什麼Lua中的異常處理在我們的案例中沒有意義。 –

2

想想這個問題的另一種方法可能是將問題放在頭上,問「在C中編譯Lua(如果我們已經在使用C++)是否有任何好處?」

如果將Lua編譯爲C並沒有什麼好處,並且據我所知,並不存在 - 而且您已經在使用C++作爲其他代碼,將Lua編譯爲C++看起來既簡單又可能有點更強大,因爲如果從Lua中回調到C++時發生意外拋出,您將永遠不會有非C++堆棧幀來搞亂堆棧倒回...

相關問題