Linux下C/C++和lua互動-Table

來源:互聯網
上載者:User

標籤:return   hang   www.   file   ace   狀態   相同   null   研發   

  本來這些文章都是在我的個人網站www.zhangyi.studio,目前處在備案狀態,暫時訪問不了,所以搬到這邊。

 

   最近這兩天需要弄清楚C++和lua間相互調用和資料傳遞,廢話不多說,直接上過程。

        首先是環境環境,Linux(Debian),安裝lua,注意需要管理員權限。

   sudo apt-get install lua5.2

        安裝完後輸入lua或者lua -v 嚴重是否安裝成功以及安裝的版本,當然,有了lua運行環境還不夠我們還需要安裝lua開發庫既然我們安裝的是lua5.2那麼開發庫同樣安裝成5.2版本,命令如下:

   sudo apt-get install liblua5.2-dev

        當然,lua的環境準備好了,既然要研究lua和C/C++的互動,那gcc/g++是必不可少的,至於怎麼安裝,此處略過,預設認為已安裝好。

        那麼接下來就得寫代碼驗證一下,因為lua是一種解釋性語言,它不不同於C/C++,且兩者之間不能直接做資料互動,需要一種類似於“棧”的結構來實現資料互動,規定是:C/C++有C/C++的環境,lua有lua的環境,兩張互不干擾,如需互動資料,雙方都要把資料放入“棧”中;並且lua和C/C++的資料類型也不相同,所以不能直接從棧中拿來使用。以下說明一種最典型的lua資料類型-table,如下:

1    //Data.lua2     Data =3      {4         name = "zhang_yi" ,5         age = 24 ,6         homepage = "zhangyi.studio" ,7         lover = "lijuanxian" ,8       }

 

        假設我現在要用當前檔案Data.lua中讀取某個元素,例如name元素,一般有如下幾個步驟:

 1     //建立luaState 2     lua_State *L = luaL_newstate(); 3      4     //載入lua檔案,dofile是載入並執行檔案,結果是產生全域table 5     luaL_dofile(L ,"Data.lua"); 6      7     //將我們需要處理的table置於棧頂,此時全域變數Data的index為-1(棧頂) 8     lua_getglobal(L, "Data"); 9     10     //將我們需要讀取的元素索引壓棧,此時Data的index為-2,"name"的index為-111     lua_pushstring(L, "name");12     //調用尋找介面,過程:用棧頂元素作為索引在table中尋找對應得元素,如果查到13     //POP索引(此處為"name"),把結果放到棧頂(查到的值返回到棧頂,index =-1)14     lua_gettable(L, -2);15     16     //讀取查到的結果,當然,需要先做類型判斷17     lua_isstring(L, -1)18     string str = lua_tostring(L, -1);19     20     //至此,我們便從lua指令碼的table中取得了我們想要的元素。21     //當然最後別忘了銷毀現場22     lua_close(L);

 

        全部源碼如下:

    ①、Data.lua

1     --Data.lua2         Data =3      {4         name = "zhang_yi" ,5         age = 24 ,6         homepage = "zhangyi.studio" ,7         lover = "lijuanxian" ,8       }

    ②、cUseLua.cpp

 1   //cUseLua 2    #include <iostream> 3    #include <string.h> 4    #include "mylua.h" 5   6    using namespace std; 7   8    int main() 9    {10       lua_State *L = luaL_newstate();11       if(L == NULL)12       {13       cout<<"Creat Lua State Error !"<<endl;14       return 1;15       }16        int ret = luaL_dofile(L ,"Data.lua");17       if(ret)18       {19       cout<<"Lua doFile Error !"<<endl;20       return 1;21       }22       lua_getglobal(L, "Data");23       lua_pushstring(L, "name");24       lua_gettable(L, -2);25        if(lua_isstring(L, -1))26       {27       string str = lua_tostring(L, -1);28       cout<<str<<endl;29       }30  31       lua_close(L);32       return 0 ;33    }

    ③、mylua.h

 1    //mylua.h 2    #ifndef MYLUA_H_ 3    #define MYLUA_H_ 4   5    extern "C" 6    { 7       #include<lua5.2/lua.h> 8       #include<lua5.2/lauxlib.h> 9       #include<lua5.2/lualib.h>10    }11    #endif        

        最後,編譯運行

    g++ -o Main main.cpp -llua5.2

        通過table互動資料的目的達到了,接下來就是C/C++調用寫在lua中的函數以及lua指令碼調用C/C++介面因為lua作為一種輕量級的解釋性語言,不需要編譯連結等步驟,所以作為C/C++內嵌語言非常合適,我們在

項目研發過程中特別希望程式能經常不變,或者說不經常改動,再此,更加體現出類似於lua這種解釋性語言的魅力,一些需要經常變動的介面或者邏輯用lua來寫,然後讓主程式(C、C++)通過固定的介面來調用,這樣

便可以達到目的。

Linux下C/C++和lua互動-Table

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.