#include <iostream> #include <string.h> extern "C" { /*頭文件lua.h定義了Lua提供的基礎函數,包括創建Lua環境、調用Lua函數、讀寫Lua環境中全局變量,以及注冊供Lua調用的新函數等等*/ #include "lua-5.2.2/src/lua.h" /*頭文件lauxlib.h定義了輔助庫提供的輔助函數,它的所有定義都以LuaL_開頭。輔助庫是一個使用lua.h中API編寫出的一個較高的抽象層。 Lua的所有標准庫編寫都用到了輔助庫;輔助庫主要用來解決實際的問題。輔助庫並沒有直接訪問Lua的內部,它都是用官方的基礎API來完成所有工作的*/ #include "lua-5.2.2/src/lauxlib.h" /* 頭文件lualib.h定義了打開標准庫的函數。Lua庫中沒有定義任何全局變量。它將所有的狀態都保存在動態結構lua_State中, 所有的C API都要求傳入一個指向該結構的指針。luaL_newstate函數用於創建一個新環境或狀態。當luaL_newstate創建一個新的環境時,新的環境中並沒有包含預定義的函數(eg.print)。為了使Lua保持靈活, 小巧,所有的標准庫都被組織到了不同的包中。當我們需要使用哪個標准庫時,就可以調用lualib.h中定義的函數來打開對應的標准庫;而輔助函數luaL_openlibs則可以打開所有的標准庫 */ #include "lua-5.2.2/src/lualib.h" } int main() { char buff[256] = {0}; int error; // 打開Lua,lua_State有的說是虛擬機有的說是狀態機,感覺是其與lua交互的東西,里面有交互棧的相關信息 // 所有C api函數的第一個參數都是這個lua_state lua_State *L = luaL_newstate(); luaL_openlibs(L); // 打開標准庫,lua所有的庫都是以閉包 while (fgets(buff, sizeof(buff), stdin) != NULL) { /* luaL_loadbuffer編譯輸入的lua代碼,沒有錯誤返回0並將編譯之后的chunk壓入棧 */ /* 將chunk從棧中彈出並在保護模式下運行 */ error = luaL_loadbuffer(L, buff, strlen(buff), "line") || lua_pcall(L, 0, 0, 0); if (error) { /* 如果有錯誤上面這兩個函數都將錯誤信息壓入棧 lua_tostring從棧中獲取 */ fprintf(stderr, "%s", lua_tostring(L, -1)); /* 從棧中刪除錯誤信息 */ lua_pop(L, 1); // 從棧中彈出錯誤消息 } } lua_close(L); getchar(); return 0; }