成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C\C++和Lua是如何進行通信的?

開發 后端 前端
lua本身就是用標準C編寫的,它的優點是小巧和靈活,而且又是動態語言,是解釋執行的,所以適合用在游戲和一些嵌入式環境里。下面將實現Lua和其他語言之間的通信……

為了實現Lua和其他語言之間的通信,Lua虛擬機為C\C++提供了兩個特性:

一,Lua_State狀態機

lua_State主要是管理一個lua虛擬機的執行環境, 一個lua虛擬機可以有多個執行環境。Lua虛擬機通過維護這樣一個虛擬棧來實現兩種之間的通信,lua_State定義如下:

  1. struct lua_State {  
  2.   CommonHeader;  
  3.   lu_byte status;  
  4.   StkId top;  /* first free slot in the stack */ 
  5.   global_State *l_G;  
  6.   CallInfo *ci;  /* call info for current function */ 
  7.   const Instruction *oldpc;  /* last pc traced */ 
  8.   StkId stack_last;  /* last free slot in the stack */ 
  9.   StkId stack;  /* stack base */ 
  10.   int stacksize;  
  11.   unsigned short nny;  /* number of non-yieldable calls in stack */ 
  12.   unsigned short nCcalls;  /* number of nested C calls */ 
  13.   lu_byte hookmask;  
  14.   lu_byte allowhook;  
  15.   int basehookcount;  
  16.   int hookcount;  
  17.   lua_Hook hook;  
  18.   GCObject *openupval;  /* list of open upvalues in this stack */ 
  19.   GCObject *gclist;  
  20.   struct lua_longjmp *errorJmp;  /* current error recover point */ 
  21.   ptrdiff_t errfunc;  /* current error handling function (stack index) */ 
  22.   CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */ 
  23. }; 

1,虛擬棧的管理, 包括管理整個棧和當前函數使用的棧的情況

2,CallInfo的管理, 包括管理整個CallInfo數組和當前函數的CallInfo

3,hook相關的, 包括hookmask, hookcount, hook函數等

4,global_State是全局唯一的,存放多個lua_State之間的一些共享數據

5,gc的一些管理和當前棧中upvalue的管理

6,錯誤處理的支持等等

C\C++和Lua擁有不同的數據類型,要實現兩者之間的數據通信怎么辦?Lua虛擬機提供Lua_State這樣一種數據結構。任何一種數據從C\C++傳入Lua虛擬機中,Lua都會將這類數據轉換為一種通用的結構lua_TValue,并且將數據復制一份,將其壓入虛擬棧中。lua_TValue定義如下:

  1. struct lua_TValue {  
  2.   TValuefields;  
  3. };  
  4.    
  5. #define TValuefields  \  
  6.     union { struct { Value v__; int tt__; } i; double d__; } u  
  7.    
  8. union Value {  
  9.   GCObject *gc;    /* collectable objects */ 
  10.   void *p; /* light userdata */ 
  11.   int b;   /* booleans */ 
  12.   lua_CFunction f; /* light C functions */ 
  13.   numfield /* numbers */ 
  14. }; 

Lua有自己的GC,C\C++由自己申請和釋放內存,所以兩者之間的內存管理是獨立的。從C\C++中傳遞數據到Lua虛擬機會發生數據拷貝,從Lua虛擬機中傳遞出來是直接從虛擬棧中取值或者地址,所以數據從虛擬棧中pop之后,是否依然是有效引用需要額外注意。

 二,C API

Lua腳本實現交互提供了一系列的C API,常用API有:

luaL_newstate函數用于初始化一個lua_State實例

luaL_openlibs函數用于打開Lua中的所有標準庫,如io庫、string庫等。

luaL_loadbuffer編譯了buff中的Lua代碼,如果沒有錯誤,則返回0,同時將編譯后的程序塊壓入虛擬棧中。

lua_pcall函數會將程序塊從棧中彈出,并在保護模式下運行該程序塊。執行成功返回0,否則將錯誤信息壓入棧中。

lua_tostring函數中的-1,表示棧頂的索引值,棧底的索引值為1,以此類推。該函數將返回棧頂的錯誤信息,但是不會將其從棧中彈出。

lua_pop是一個宏,用于從虛擬棧中彈出指定數量的元素,這里的1表示僅彈出棧頂的元素。

lua_close用于釋放狀態指針所引用的資源。

入棧操作:

Lua針對每種C類型,都有一個C API函數與之對應,如:

void lua_pushnil(lua_State* L);  --nil值

void lua_pushboolean(lua_State* L, int b); --布爾值

void lua_pushnumber(lua_State* L, lua_Number n); --浮點數

void lua_pushinteger(lua_State* L, lua_Integer n);  --整型

void lua_pushlstring(lua_State* L, const char* s, size_t len); --指定長度的內存數據

void lua_pushstring(lua_State* L, const char* s);  --以零結尾的字符串,其長度可由strlen得出。 

出棧操作:

API使用“索引”來引用棧中的元素,第一個壓入棧的為1,第二個為2,依此類推。我們也可以使用負數作為索引值,其中-1表示為棧頂元素,-2為棧頂下面的元素,同樣依此類推。

Lua提供了一組特定的函數用于檢查返回元素的類型,如:

int lua_isboolean (lua_State *L, int index);

int lua_iscfunction (lua_State *L, int index);

int lua_isfunction (lua_State *L, int index);

int lua_isnil (lua_State *L, int index);

int lua_islightuserdata (lua_State *L, int index);

int lua_isnumber (lua_State *L, int index);

int lua_isstring (lua_State *L, int index);

int lua_istable (lua_State *L, int index);

int lua_isuserdata (lua_State *L, int index);

以上函數,成功返回1,否則返回0。需要特別指出的是,對于lua_isnumber而言,不會檢查值是否為數字類型,而是檢查值是否能轉換為數字類型。

有關API的具體用法或者了解更多的API請訪問其官方網站

原文出自:http://my.oschina.net/xlplbo/blog/314956

責任編輯:林師授 來源: xlplbo的博客
相關推薦

2010-01-20 09:32:30

C++類

2010-01-20 13:29:40

C++環境

2010-01-27 15:29:45

C++異常處理

2010-01-20 10:49:29

Visual C++界

2010-02-02 13:04:03

C++頭文件

2010-01-15 19:05:42

學習C++

2010-01-19 14:39:22

C++ Builder

2010-01-12 09:59:08

Visual C++

2010-01-27 10:45:21

C++單例模式

2010-01-22 16:21:50

C++ Builder

2010-02-05 17:16:05

C++構造函數

2010-01-15 17:31:18

C++Test

2010-01-28 10:33:10

C++開發程序

2009-08-27 15:33:58

C# Cookie編程

2020-07-31 18:33:56

C++編程語言

2019-08-28 14:21:39

C++C接口代碼

2010-01-15 18:06:20

C++引用

2010-01-22 18:06:24

C++代碼

2010-01-22 13:20:27

C++代碼

2010-01-25 14:43:00

C++構造函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区四区五区 | 欧美美女爱爱 | 国产超碰人人爽人人做人人爱 | 国产成人免费视频 | 久久久久久久久精 | 1级黄色大片 | 国产日韩精品在线 | 亚洲欧洲视频 | 欧美人妖网站 | 国产精品美女久久久 | 草草草网站 | 国产精品久久久久久久久久免费看 | 97久久久| 一区二区三区福利视频 | 国产一级视频在线播放 | 狠狠av | 久久蜜桃av一区二区天堂 | 国产高潮av | 亚洲精品视频导航 | 国产伦精品一区二区三区高清 | 在线观看成人免费视频 | 91久久 | 亚洲网址在线观看 | 国产一区免费视频 | 97精品一区二区 | 国产成人高清成人av片在线看 | 国产激情91久久精品导航 | www精品美女久久久tv | 亚洲精品自拍 | 国产亚洲一区二区精品 | 婷婷激情综合 | 免费99视频 | 亚洲精品专区 | 99久视频| 午夜欧美| wwwsihu| 黑人巨大精品欧美一区二区免费 | 亚洲国产精品成人无久久精品 | 精品亚洲一区二区三区四区五区 | 亚洲成av人片在线观看无码 | 亚洲视频在线观看 |