在Lua中調用C++函數

 

翻譯自http://gamedevgeek.com/tutorials/calling-c-functions-from-lua/

在Lua中調用C++函數

我的第二部分教程講解了怎樣在C++中調用Lua函數。在這部分中,我們將討論相反的情況——在Lua中調用C++函數。由於我沒有想到一個簡單的例子來說明這種情況,因此,我借用了Lua官方文檔中的average函數來進行講解。

本教程涵蓋了Lua5.1。在Lua的每一個版本中都有一些非常不同之處。下面的示例代碼將不能在老版本的Lua下運行。如果你仍然在使用老版本而且不願意升級,不用擔心,我已經在文章底部提供了4.0和5.0教程的源代碼下載連接。好了,讓我們開始吧!

在本文中我們將用C++創建一個函數,告訴Lua解釋器它的情況,最後從Lua中調用它並使用其結果。我在後面也將談一談Lua程序中的錯誤檢查。

定義函數

第一步是定義函數。所有在Lua中被調用的C/C++函數將使用下面一類指針進行調用:


換句話說,函數必須要以Lua解釋器作爲唯一的參數,並且返回一個唯一的整數。由於用一個Lua解釋器作爲參數,因此函數實際上能夠從棧中取得任意數量的參數。在後面我們將看到,返回的整數實際上是被壓入棧的值的個數。通過如此容易的封裝,就能滿足你在Lua中調用C++函數的需求。

下面給出的C++函數average()演示瞭如何接受多個參數且返回超過一個值。記住,該函數是一個與上面typedef相匹配的函數。

  1. lua_gettop函數返回棧頂的索引值。因爲在Lua中棧是從1開始編號的,因此該函數獲得的值就是參數的個數。
  2. 在for循環中計算所有參數之和。
  3. 調用lua_pushnumber()將參數的平均值壓棧。
  4. 將參數之和壓入棧中。
  5. 最後,函數返回2,說明有兩個返回值在棧中。 

現在C++函數已經被定義好了,我們必須將它告訴Lua解釋器。這將在main函數中初始化Lua解釋器和載入庫完成之後完成:


保存文件爲luaavg.cpp。如果你直接使用C而不是C++,將文件名改爲luaavg.c,然後將extern "C"刪除。


下面是以5個參數調用average函數並且顯示兩個返回值的Lua腳本,我們將其保存爲avg.lua:


編譯

在Linux下,在命令行鍵入:


然後,鍵入下列命令運行:


如果沒有問題, 程序將顯示出平均值、和。

在Visual C++你將需要進行下列步驟:

  1. 創建一個新的空Win32控制檯應用工程。
  2. 將"luatest.cpp"加入你的工程。
  3. 選擇項目菜單中的屬性菜單。
  4. 在"連接器"的"輸入"欄目的"附加依賴項"中輸入"lua5.1.lib"。
  5. 確定。

此時,按F7構建程序。

如果你採用的是dll庫,請確保將其放在應用程序的目錄中或者windows系統能夠找到它的地方。如果你採用的是靜態連接庫,則不需要。

錯誤處理

如果你已經閱讀了Lua的API文檔,你將看出實際上我上面的average函數沒有進行錯誤檢查。這樣做是爲了更容易地講解,然而在真實的程序中你應該做一些錯誤檢測。在上面的例子中,我們至少應該檢查每個參數是不是數字。通過在for循環中添加下面的代碼來實現:


添加這樣的檢查很容易,同時這樣也讓調試更容易。當處理用兩種不同語言編寫的程序的時候,這顯得相當重要。

(本文由Groov0V翻譯,轉載請指明出處!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章