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源碼樹一起編譯