翻譯自http://gamedevgeek.com/tutorials/calling-lua-functions/
呼叫lua函式
這是lua指令碼語言教程系列之二。在第一篇中,我們學習了在windows和linux下編譯並執行"hello, world!"程式。如果你沒有看過,請參考lua入門一文。
這篇文章將教你如何在lua中定義乙個函式,然後在c/c++程式中呼叫它。同時,我們將學習到引數傳遞,返回值,以及處理全域性變數。
你的第乙個lua函式
在lua中定義函式是相當簡單的。lua函式以關鍵字"function"開頭,後面跟隨函式名,然後是引數列表。函式定義以關鍵字"end"結束。lua函式能夠接受多個引數,而且可以返回多個引數。
下面是乙個實現兩個數相加並返回結果的lua函式。我們將它儲存為"add.lua"檔案。
-- add two numbers
function add ( x, y )
return x + y
end在lua入門中,我們已經知道呼叫lual_dofile()就是執行指令碼。因為在本文中我們只定義了乙個函式,故只需簡單地呼叫lual_dofile()函式就能執行add函式。
我在前面已經說過,lua函式能夠接受多個引數,返回多個結果。這是用棧來實現的。
為了呼叫乙個lua函式,首先需要將函式壓入棧中。再將引數壓入。然後,呼叫lua_call()去呼叫lua函式。函式呼叫完成之後,返回值存在於棧中。所有這些步驟將被展示在luaadd()函式定義中。
呼叫lua_getglobal()將add()函式壓入棧中。
呼叫lua_pushnumber()將第乙個引數x壓入棧中。
同樣,呼叫lua_pushnumber()將第二個引數y壓入棧中。
呼叫lua_call(),其引數的意思是兩個引數,乙個返回值。
現在,我們可以利用lua_tointeger()獲得整型返回值。
最後,呼叫lua_pop()將值從棧中移出。
儲存檔案為luaadd.cpp。如果你直接使用c而不是c++,將檔名改為luaadd.c,然後將extern "c"刪除。
#include
extern "c"
/* 指向lua直譯器的指標 */
lua_state* l;
int luaadd ( int x, int y )
int main ( int argc, char *argv )
編譯在linux下,在命令列鍵入:
g++ luaadd.cpp -llua -ldl -o luaadd
然後,鍵入下列命令執行:
./luaadd
如果沒有問題, 程式將顯示結果為: "the sum is 25"。
在visual c++你將需要進行下列步驟:
建立乙個新的空win32控制台應用工程。
將"luatest.cpp"加入你的工程。
選擇專案選單中的屬性選單。
在"聯結器"的"輸入"欄目的"附加依賴項"中輸入"lua5.1.lib"。
確定。
此時,按f7構建程式。
如果你採用的是dll庫,請確保將其放在應用程式的目錄中或者windows系統能夠找到它的地方。如果你採用的是靜態連線庫,則不需要。
全域性變數
全域性變數在lua中也很好處理。就像我們看到的,lua_getglobal()將乙個lua全域性變數壓入棧中。例如,在lua指令碼中包含乙個全域性變數z,下面**的功能就是得到它的值:
lua_getglobal(l, "z");
z = (int)lua_tointeger(l, -1);
lua_pop(l, 1);
相應地,lua_setglobal()函式能夠設定全域性變數地值。下面這段**演示了如何將lua全域性變數z的值變為10:
lua_pushnumber(l, 10);
lua_setglobal(l, "z");
應該記住:在lua中,我們沒有必要顯式定義乙個全域性變數。如果全域性變數不存在,呼叫lua_setglobal()將為你建立乙個。
lua呼叫c函式
最近在進入lua程式設計的狀態,一度令我困惑的是,lua提供的功能少的可憐,跟自備電池的python相比,可說是簡陋了。連table的列印,都需要自己實現,也因此有了一打的第三方方案。後來我想明白了,以lua和c如此緊密的關係,只需要建立lua的binding,那麼豐富而效能強大的c庫資源完全可以為...
lua呼叫c函式
lua可以呼叫c函式的能力將極大的提高lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過c函式來實現,之後再通過lua呼叫指定的c函式。對於那些可被lua呼叫的c函式而言,其介面必須遵循lua要求的形式,即 typedef int lua cfu...
lua檔案函式呼叫
lua指令碼是面向過程的語言,一般檔案結構 data.lua local idata 0 local arrdata local表示區域性變數或函式 只要沒有local宣告就是全域性的 iopen是全域性變數 optdata是私有函式 local function optdata iopen 10 ...