解析調(diào)用Lua函數(shù)使用方法
調(diào)用Lua函數(shù)使用方法是本文要介紹的內(nèi)容,本教程涵蓋了Lua5.1。在Lua的每一個版本中都有一些非常不同之處。下面的示例代碼將不能在老版本的Lua下運行。這篇文章將教你如何在Lua中定義一個函數(shù),然后在C/C++程序中調(diào)用它。同時,我們將學(xué)習(xí)到參數(shù)傳遞,返回值,以及處理全局變量。
你的***個Lua函數(shù)
在Lua中定義函數(shù)是相當(dāng)簡單的。Lua函數(shù)以關(guān)鍵字"function"開頭,后面跟隨函數(shù)名,然后是參數(shù)列表。函數(shù)定義以關(guān)鍵字"end"結(jié)束。Lua函數(shù)能夠接受多個參數(shù),而且可以返回多個參數(shù)。
下面是一個實現(xiàn)兩個數(shù)相加并返回結(jié)果的Lua函數(shù)。我們將它保存為"add.lua"文件。
- -- add two numbersfunction add ( x, y )return x + yend
 
在Lua入門中,我們已經(jīng)知道調(diào)用luaL_dofile()就是執(zhí)行腳本。因為在本文中我們只定義了一個函數(shù),故只需簡單地調(diào)用luaL_dofile()函數(shù)就能執(zhí)行add函數(shù)。
我在前面已經(jīng)說過,Lua函數(shù)能夠接受多個參數(shù),返回多個結(jié)果。這是用棧來實現(xiàn)的。
為了調(diào)用一個Lua函數(shù),首先需要將函數(shù)壓入棧中。再將參數(shù)壓入。然后,調(diào)用lua_call()去調(diào)用Lua函數(shù)。函數(shù)調(diào)用完成之后,返回值存在于棧中。所有這些步驟將被展示在luaadd()函數(shù)定義中。
調(diào)用lua_getglobal()將add()函數(shù)壓入棧中。
調(diào)用lua_pushnumber()將***個參數(shù)x壓入棧中。
同樣,調(diào)用lua_pushnumber()將第二個參數(shù)y壓入棧中。
調(diào)用lua_call(),其參數(shù)的意思是兩個參數(shù),一個返回值。
現(xiàn)在,我們可以利用lua_tointeger()獲得整型返回值。
***,調(diào)用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函數(shù) */
 - lua_getglobal(L, "add");
 - /* ***個參數(shù) */
 - lua_pushnumber(L, x);
 - /* 第二個參數(shù) */
 - lua_pushnumber(L, y);
 - /* 調(diào)用函數(shù),告知有兩個參數(shù),一個返回值 */
 - lua_call(L, 2, 1);
 - /* 得到結(jié)果 */
 - 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");
 - /* 調(diào)用Lua函數(shù) */
 - sum = luaadd( 10, 15 );
 - /* 顯示結(jié)果 */
 - 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
 
如果沒有問題, 程序?qū)@示結(jié)果為: "The sum is 25"。
在Visual C++你將需要進(jìn)行下列步驟:
創(chuàng)建一個新的空Win32控制臺應(yīng)用工程。
將"luatest.cpp"加入你的工程。
選擇項目菜單中的屬性菜單。
在"連接器"的"輸入"欄目的"附加依賴項"中輸入"lua5.1.lib"。
確定。
此時,按F7構(gòu)建程序。
如果你采用的是dll庫,請確保將其放在應(yīng)用程序的目錄中或者windows系統(tǒng)能夠找到它的地方。如果你采用的是靜態(tài)連接庫,則不需要。
全局變量
全局變量在Lua中也很好處理。就像我們看到的,lua_getglobal()將一個Lua全局變量壓入棧中。例如,在Lua腳本中包含一個全局變量z,下面代碼的功能就是得到它的值:
- lua_getglobal(L, "z");z = (int)lua_tointeger(L, -1);lua_pop(L, 1);
 
相應(yīng)地,lua_setglobal()函數(shù)能夠設(shè)置全局變量地值。下面這段代碼演示了如何將Lua全局變量z的值變?yōu)?0:
- lua_pushnumber(L, 10);lua_setglobal(L, "z");
 
應(yīng)該記?。涸?strong>Lua中,我們沒有必要顯式定義一個全局變量。如果全局變量不存在,調(diào)用lua_setglobal()將為你創(chuàng)建一個。
小結(jié):解析調(diào)用Lua函數(shù)使用方法的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!















 
 
 

 
 
 
 