透過例子學習Lua(6)--C/C++中用Lua函式(轉)

post0發表於2007-08-12
透過例子學習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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章