程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++與Lua交互(二)

C++與Lua交互(二)

編輯:C++入門知識

我們在LuaWithCPPTest項目下,查看Source.cpp代碼如下:   #include <iostream> #include <fstream> #include <string> using namespace std;   extern "C" {     #include <lua.h>     #include <lauxlib.h>     #include <lualib.h> };   void TestLua();   int main() {     TestLua();     return 0; }   void TestLua() {     lua_State *L = luaL_newstate();     luaopen_base(L); //     luaopen_table(L); //     luaopen_package(L); //     luaopen_io(L); //     luaopen_string(L); //       luaL_openlibs(L); //打開以上所有的lib       string str;         while (true)     {         cout << "請輸入Lua代碼:" << endl;         getline(cin, str, '\n');         if (luaL_loadstring(L, str.c_str())             || lua_pcall(L, 0, 0, 0) )         {             const char * error = lua_tostring(L, -1) ;             cout << string(error) << endl;         }     }       lua_close(L); } 其中,被extern "C"包起來的是lua的主要函數的聲明。在C++中,每個嵌入的lua的生命周期與各自的lua_State對象一一對應。通過luaL_newstate()方法,我們便創建了一個lua解釋器。隨後的幾個luaopen_*方法,都是獲取相應lua庫的使用權,最後通過luaL_openlibs打開所有的有使用權的lua標准庫。一切准備就緒後,我們開始接收輸入。   image   image   image   我們通過luaL_loadstring,將所有代碼讀入lua,並且檢查代碼是否有語法錯誤。然後通過lua_pcall,運行代碼,將所有的全局變量保存在_G中。通過讀取、運行這兩步,我們就建立起一個自己的lua解釋器了。   將lua作為配置文件   從文件讀取lua代碼,流程與之前的示例一樣,僅是將luaL_loadstring()換成luaL_loadfile()即可。代碼如下:    string str; while (true) {     cout << "輸入lua文件路徑:" << endl;     getline(cin, str, '\n');     if (luaL_loadfile(L, str.c_str())         || lua_pcall(L, 0, 0, 0) )     {         const char * error = lua_tostring(L, -1) ;         cout << string(error) << endl;         return;     }   } image   image   現在,我們在lua中定義變量,並且賦值。然後在c++中取值,運算出結果。在lua文件中,內容如下:   image   在c++中,我們獲取a,b兩個變量的值,然後相加,算出結果:   #include <iostream> #include <fstream> #include <string> using namespace std;   extern "C" {   #include <lua.h> #include <lauxlib.h> #include <lualib.h> };   void TestLua();   int main() {     TestLua();     return 0; }   void TestLua() {     lua_State *L = luaL_newstate();     luaopen_base(L); //     luaopen_table(L); //     luaopen_package(L); //     luaopen_io(L); //     luaopen_string(L); //       luaL_openlibs(L); //打開以上所有的lib       string str;     while (true)     {         cout << "輸入lua文件路徑:" << endl;         getline(cin, str, '\n');         if (luaL_loadfile(L, str.c_str())             || lua_pcall(L, 0, 0, 0) )         {             const char * error = lua_tostring(L, -1) ;             cout << string(error) << endl;             return;         }         else         {             break;         }       }       int a = 0;     int b = 0;       // 獲取a的值     lua_getglobal(L, "a");     if (!lua_isnumber(L, -1))     {         cout << "-2 error" << lua_isnumber(L, -1) << lua_isnumber(L, -1) << endl;         return ;     }       a = lua_tonumber(L, -1);       // 獲取b的值     lua_getglobal(L, "b");     if (!lua_isnumber(L, -1))     {         cout << "-1 error" << endl;         return ;     }          b = lua_tonumber(L, -1);       cout << "a = " << a << " b = " << b << endl;     cout << "a + b = " << a + b << endl;       lua_close(L);   }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved