透過例子學習Lua(6)--C/C++中用Lua函式(轉)
透過例子學習Lua(6)--C/C++中用Lua函式(轉)[@more@] 1.簡介 偶們這次主要說說怎麼由Lua定義函式, 然後在C或者C++中呼叫. 這裡偶們 暫不涉及C++的物件問題, 只討論呼叫函式的引數, 返回值和全域性變數的使用. 2.程式 這裡偶們在e12.lua裡先定義一個簡單的add(), x,y為加法的兩個引數, return 直接返回相加後的結果. 例e12.lua -- add two numbers function add ( x, y ) return x + y end 在前一次裡, 偶們說到 lua_dofile() 可以直接在C中執行lua檔案. 因為偶們 這個程式裡只定義了一個add()函式, 所以程式執行後並不直接結果, 效果相當 於在C中定義了一個函式一樣. Lua的函式可以有多個引數, 也可以有多個返回值, 這都是由棧(stack)實現的. 需要呼叫一個函式時, 就把這個函式壓入棧, 然後順序壓入所有引數, 然後用 lua_call()呼叫這個函式. 函式返回後, 返回值也是存放在棧中. 這個過程和 彙編執行函式呼叫的過程是一樣的. 例e13.cpp 是一個呼叫上面的Lua函式的例子 #include extern "C" { // 這是個C++程式, 所以要extern "C", // 因為lua的標頭檔案都是C格式的 #include "lua.h" #include "lualib.h" #include "lauxlib.h" } /* the Lua interpreter */ lua_State* L; int luaadd ( int x, int y ) { int sum; /* the function name */ lua_getglobal(L, "add"); /* the first argument */ lua_pushnumber(L, x); /* the second argument */ lua_pushnumber(L, y); /* call the function with 2 arguments, return 1 result */ lua_call(L, 2, 1); /* get the result */ sum = (int)lua_tonumber(L, -1); lua_pop(L, 1); return sum; } int main ( int argc, char *argv[] ) { int sum; /* initialize Lua */ L = lua_open(); /* load Lua base libraries */ lua_baselibopen(L); /* load the script */ lua_dofile(L, "e12.lua"); /* call the add function */ sum = luaadd( 10, 15 ); /* print the result */ printf( "The sum is %d
", sum ); /* cleanup Lua */ lua_close(L); return 0; } 程式說明: main中過程偶們上次已經說過了, 所以這次只說說luaadd的過程 * 首先用lua_getglobal()把add函式壓棧 * 然後用lua_pushnumber()依次把x,y壓棧 * 然後呼叫lua_call(), 並且告訴程式偶們有兩個引數一個返回值 * 接著偶們從棧頂取回返回值, 用lua_tonumber() * 最後偶們用lua_pop()把返回值清掉 執行結果: The sum is 25 編譯方法 Linux下把程式存成e13.cpp g++ e13.cpp -llua -llualib -o e13 ./e13 VC下編譯方法 * 首先建立一個空的Win32 Console Application Project * 把e13.cpp加入工程中 * 點project setting,然後設定link選項, 再加上lua.lib lualib.lib兩個額外的庫 * 最後編譯 建立好的project可以在這裡下載 VC Linux 3.全域性變數 上面偶們用到了lua_getglobal()但並沒有詳細講, 這裡偶們再舉兩個小例子來說下全域性變數 lua_getglobal()的作用就是把lua中全域性變數的值壓入棧 lua_getglobal(L, "z"); z = (int)lua_tonumber(L, 1); lua_pop(L, 1); 假設Lua程式中定義了一個全域性變數z, 這段小程式就是把z的值取出放入C的變數z中. 另外Lua中還有一個對應的函式lua_setglobal(), 作用是用棧頂的值填充指定的全域性變數 lua_pushnumber(L, 10); lua_setglobal(L, "z"); 例如這段小程式就是把lua中的全域性變數z設為10, 如果lua中未定義z的話, 就會自動建立一個 全域性變數z並設為10. 4.試試看 自己寫個函式用C/C++來呼叫下試試
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951600/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 透過例子學習Lua(7)--呼叫C/C++函式(轉)C++函式
- 透過例子學習Lua(4)--函式的呼叫(轉)函式
- 透過例子學習Lua(5)--Lua與C的互動(轉)
- 透過例子學習Lua(2)---Lua流程控制(轉)
- 透過例子學習Lua(3)----Lua資料結構(轉)資料結構
- C中呼叫Lua函式函式
- 匯出 C/C++ API 給 Lua 使用[轉]C++API
- lua學習: lua及函數語言程式設計語言函數程式設計
- C++呼叫Lua API介面C++API
- lua非全域性函式函式
- lua 學習總結
- Lua學習筆記筆記
- 轉 Lua標準庫: table函式, 數學函式, 字串函式/格式化/配對,函式字串
- Lua遊戲開發(三)---Lua語言學習(上)遊戲開發
- Lua 和 C/C++ 互相呼叫例項分析C++
- Lua 學習筆記(上)筆記
- 學習Lua的意義
- 從sysbench中學習Lua
- Lua學習筆記(一)筆記
- [轉]Cocos2d-x下Lua呼叫自定義C++類和函式的最佳實踐C++函式
- openresty及lua的隨機函式REST隨機函式
- lua 函式變數 assert判斷函式變數
- c++函式學習總結C++函式
- C#與Lua語言學習對比一C#
- Lua學習(二)物件導向物件
- redis學習(八) Lua語法Redis
- Lua5.3學習筆記筆記
- lua呼叫c程式C程式
- 《Lua-in-ConTeXt》09:學一點 LuaContext
- 【程式語言】C/C++中如何使用Lua指令碼C++指令碼
- C++學習筆記(二)——函式C++筆記函式
- C/C++—— C++中函式重寫和函式過載C++函式
- C++中用函式模板實現和最佳化抽象操作(轉)C++函式抽象
- C++函式過載C++函式
- LUA與C++互動第一篇C++
- Lua——load和loadstring函式用法函式
- C++虛擬函式學習總結C++函式
- c++ 的學習 建構函式1C++函式