通過例子學(xué)習(xí)Lua(6)—C/C++中用Lua函數(shù)
1.簡介
偶們這次主要說說怎么由Lua定義函數(shù), 然后在C或者C++中調(diào)用. 這里偶們暫不涉及C++的對象問題, 只討論調(diào)用函數(shù)的參數(shù), 返回值和全局變量的使用.
2.
這里偶們在e12.lua里先定義一個簡單的add(), x,y為加法的兩個參數(shù),return 直接返回相加后的結(jié)果.
例e12.lua
- -- add two numbers
- function add ( x, y )
- return x + y end
在前一次里, 偶們說到 lua_dofile() 可以直接在C中執(zhí)行l(wèi)ua文件. 因為偶們這個程序里只定義了一個add()函數(shù), 所以程序執(zhí)行后并不直接結(jié)果, 效果相當(dāng)于在C中定義了一個函數(shù)一樣.
Lua的函數(shù)可以有多個參數(shù), 也可以有多個返回值, 這都是由棧(stack)實現(xiàn)的.需要調(diào)用一個函數(shù)時, 就把這個函數(shù)壓入棧, 然后順序壓入所有參數(shù), 然后用lua_call()調(diào)用這個函數(shù). 函數(shù)返回后, 返回值也是存放在棧中. 這個過程和匯編執(zhí)行函數(shù)調(diào)用的過程是一樣的.
例e13.cpp 是一個調(diào)用上面的Lua函數(shù)的例子
- #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\n", sum );
- /* cleanup Lua */
- lua_close(L);
- return 0;
- }
程序說明:
main中過程偶們上次已經(jīng)說過了, 所以這次只說說luaadd的過程
* 首先用lua_getglobal()把a(bǔ)dd函數(shù)壓棧
* 然后用lua_pushnumber()依次把x,y壓棧
* 然后調(diào)用lua_call(), 并且告訴程序偶們有兩個參數(shù)一個返回值
* 接著偶們從棧頂取回返回值, 用lua_tonumber()
* ***偶們用lua_pop()把返回值清掉
運行結(jié)果:
The sum is 25
編譯方法
Linux下把程序存成e13.cpp
g++ e13.cpp -llua -llualib -o e13
./e13
VC下編譯方法
* 首先建立一個空的Win32 Console Application Project
* 把e13.cpp加入工程中
* 點project setting,然后設(shè)置link選項, 再加上lua.lib lualib.lib兩個額外的庫
* ***編譯
建立好的project可以在這里下載
VC http://tonyandpaige.com/tutorials/luaadd.zip
Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz
3.全局變量
上面偶們用到了lua_getglobal()但并沒有詳細(xì)講, 這里偶們再舉兩個小例子來說下全局變量
lua_getglobal()的作用就是把lua中全局變量的值壓入棧
lua_getglobal(L, "z");
z = (int)lua_tonumber(L, 1);
lua_pop(L, 1);
假設(shè)Lua程序中定義了一個全局變量z, 這段小程序就是把z的值取出放入C的變量z中.
另外Lua中還有一個對應(yīng)的函數(shù)lua_setglobal(), 作用是用棧頂?shù)闹堤畛渲付ǖ娜肿兞?/p>
lua_pushnumber(L, 10);
lua_setglobal(L, "z");
例如這段小程序就是把lua中的全局變量z設(shè)為10, 如果lua中未定義z的話, 就會自動創(chuàng)建一個
全局變量z并設(shè)為10.
4.試試看
自己寫個函數(shù)用C/C++來調(diào)用下試
原文鏈接:http://tech.it168.com/j/2008-02-14/200802141408319.shtml