透過例子學習Lua(5)--Lua與C的互動(轉)

post0發表於2007-08-12
透過例子學習Lua(5)--Lua與C的互動(轉)[@more@]

  1.簡介

  

  Lua與C/C++結合是很緊密的, Lua與C++互動是建立在Lua與C的基礎上的, 所

  以偶先從Lua與C講起.

  

  正如第一講所說, 執行Lua程式或者說呼叫Lua主要有兩種方式:

  * 透過命令列執行"Lua"命令

  * 透過Lua的C庫

  雖然此前偶們一直用第一種方式, 但偶要告訴你, 透過Lua的C庫執行才是遊戲中

  常用的方式.

  

  2.Lua的C庫

  

  Lua的C庫可以做為Shared Library呼叫, 但一般開發遊戲時會把Lua的所有源程式

  都包含在內, 並不把Lua編譯成共享庫的形式. 因為Lua程式只有100多K, 而且幾乎

  可以在任何編譯器下Clean Compile. 帶Lua源程式的另一個好處時, 可以隨時對Lua

  本身進行擴充, 增加偶們所需的功能.

  

  Lua的C庫提供一系列API:

  * 管理全域性變數

  * 管理tables

  * 呼叫函式

  * 定義新函式, 這也可以完全由C實現

  * 垃圾收集器Garbage collector, 雖然Lua可以自動進行, 但往往不是立即執行的,

   所以對實時性要求比較高的程式, 會自己呼叫垃圾收集器

  * 載入並執行Lua程式, 這也可以由Lua自身實現

  * 任何Lua可以實現的功能, 都可以透過Lua的C API實現, 這對於最佳化程式的執行速度

   有幫助. 經常呼叫的共用的Lua程式片斷可以轉成C程式, 以提高效率. 連Lua都是C寫的

   還有什麼C不能實現呢?

  

  3.Lua與C整合的例子

  例e10.c

  /* A simple Lua interpreter. */

  #include

  #include

  int main(int argc, char *argv[]) {

  char line[BUFSIZ];

  lua_State *L = lua_open(0);

  while (fgets(line, sizeof(line), stdin) != 0)

  lua_dostring(L, line);

  lua_close(L);

  return 0;

  }

  

  編譯

  Linux/Cygwin

  * 先編譯Lua, 並把標頭檔案放入include路徑

  * gcc e10.c -llua -llualib -o e10

  

  VC6/VC2003

  * 先編譯Lua, 在Option中設定標頭檔案和庫檔案路徑

  * 新建工程,在工程配置中加入附加庫lua.lib和lualib.lib

  * 編譯成exe

  

  執行結果

  本程式的功能是實現一個Lua直譯器, 輸入的每行字元都會被解釋成Lua並執行.

  

  程式說明

  * #include 包含lua標頭檔案, 然後才可以使用API

  * lua_State *L = lua_open(0) 開啟一個Lua執行器

  * fgets(line, sizeof(line), stdin) 從標準輸入裡讀入一行

  * lua_dostring(L, line) 執行此行

  * lua_close(L) 關閉Lua執行器

  

  

  例e11.c

  /* Another simple Lua interpreter. */

  #include

  #include

  #include

  int main(int argc, char *argv[]) {

  char line[BUFSIZ];

  lua_State *L = lua_open(0);

  lua_baselibopen(L);

  lua_iolibopen(L);

  lua_strlibopen(L);

  lua_mathlibopen(L);

  while (fgets(line, sizeof(line), stdin) != 0)

  lua_dostring(L, line);

  lua_close(L);

  return 0;

  }

  

  執行結果

  本程式的功能是實現一個Lua直譯器, 輸入的每行字元都會被解釋成Lua並執行.

  與上例不同的是, 本例呼叫了Lua的一些標準庫.

  

  程式說明

  * #include 包含Lua的標準庫

  * 以下這幾行是用來讀入Lua的一些庫, 這樣偶們的Lua程式就可以有更多的功能.

  lua_baselibopen(L);

  lua_iolibopen(L);

  lua_strlibopen(L);

  lua_mathlibopen(L);

  

  4.試試看

  把上面兩個小例子在你熟悉的編譯器中編譯執行, 並試試能否與Lua原始碼樹一起編譯

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951602/,如需轉載,請註明出處,否則將追究法律責任。

相關文章