解析調用Lua函數使用方法
調用Lua函數使用方法是本文要介紹的內容,本教程涵蓋了Lua5.1。在Lua的每一個版本中都有一些非常不同之處。下面的示例代碼將不能在老版本的Lua下運行。這篇文章將教你如何在Lua中定義一個函數,然后在C/C++程序中調用它。同時,我們將學習到參數傳遞,返回值,以及處理全局變量。
你的***個Lua函數
在Lua中定義函數是相當簡單的。Lua函數以關鍵字"function"開頭,后面跟隨函數名,然后是參數列表。函數定義以關鍵字"end"結束。Lua函數能夠接受多個參數,而且可以返回多個參數。
下面是一個實現兩個數相加并返回結果的Lua函數。我們將它保存為"add.lua"文件。
- -- add two numbersfunction add ( x, y )return x + yend
在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 <stdio.h> extern "C" {
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
- /* 指向Lua解釋器的指針 */
- lua_State* L;
- int luaadd (
- int x, int y
- ){
- int sum;
- /* 通過名字得到Lua函數 */
- lua_getglobal(L, "add");
- /* ***個參數 */
- lua_pushnumber(L, x);
- /* 第二個參數 */
- lua_pushnumber(L, y);
- /* 調用函數,告知有兩個參數,一個返回值 */
- lua_call(L, 2, 1);
- /* 得到結果 */
- sum = (int)lua_tointeger(L, -1);
- lua_pop(L, 1);
- return sum;
- }
- int main ( int argc, char *argv[] ){
- int sum;
- /* 初始化Lua */
- L = lua_open();
- /* 載入Lua基本庫 */
- luaL_openlibs(L);
- /* 載入腳本 */
- luaL_dofile(L, "add.lua");
- /* 調用Lua函數 */
- sum = luaadd( 10, 15 );
- /* 顯示結果 */
- printf( "The sum is %d/n", sum );
- /* 清除Lua */
- lua_close(L);
- /* 暫停 */
- printf( "Press enter to exit…" );
- getchar();
- return 0;
- }
編譯
在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函數使用方法的內容介紹完了,希望通過本文的學習能對你有所幫助!