青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Basic types

Tolua自動將C/C++的基本類型映射到lua的基本類型。因此,char, int, float, double映射到Luanumber類型;char *映射到stringvoid *映射到userdataTypes may be preceded by modifiers (unsigned, static, short, const, etc.);然而,認識到tolua忽略了用于修飾基本類型的constbe aware that tolua ignores the modifier const if applied to basic types)。因此,如果我們傳遞一個基本類型的常數(conston)給Lua而后Lua再把該數返回給C/C++,這時非常量到常量之間的轉換會在后臺悄悄的進行。

C/C++的函數也可以明確的使用Lua的對象。因此lua_Object也被認為是一個基本類型。所以,任何的Lua都滿足這一要求。

新的tolua + + :在C++中的string類型同樣被認為是基本類型,會被當作值創遞給lua(使用c_str()方法)。這個功能可以使用命令行-S進行關閉。

User defined types

所有在package文件里的其他類型都會被認為是用戶自定義類型。它們會映射到Lua的userdata類型。Lua只能存儲指向用戶定義類型的指針;但是,tolua會自動產生必要的安排來處理引用和值。例如,如果一個函數或方法返回一個用戶定義類型的值,當這個值返回lua的時候,tolua會分配一個克隆對象,同時會設置垃圾收集標記,用于在Lua不再使用該對象時自動釋放。

對于用戶定義類型,常量是被保留的。因此將非常量用戶定義類型數據作為常量參數傳遞給一個函數,會產生類型不匹配的錯誤。

NULL and nil

C/C++ 的NULL或0指針映射到Lua的nil類型;反之,nil可能會指向任何可能的C/C++指針(conversely, nil may be specified wherever a C/C++ pointer is expected.)。

Typedefs

Tolua還接受package文件簡單的typedef(tolua also accepts simple typedef's inside the package files.)。任何一種類型當定義的時候,tolua會將其映射到基本類型。它們是很有用的因為一些package會將C/C++類型重新定制轉為它們的類型。例如,一個package可以定義類型real來表示一個double類型。在這種情況下,real可用于被lua解析的指定類型變量的package文件(real can be used to specify the variable types inside the package file interpreted by tolua),但只有我們在使用之前包括下面的定義:

typedef double real;

否則,real將會被解釋為用戶定義類型而不會映射到Lua的number類型。

Including real header files

在package文件中,我們必須指定對應的頭文件,這些頭文件包含著我們要訪問的常數,變量,函數和類。在package文件里任意以$ (except $[hclp]file, $[ , and $] lines)開頭的一行會被無修過的插入到生成的綁定到C/C++的代碼,但是會消除$號本身。我們用這個特性類引入真正的頭文件。所以,我們的頭文件一般會設置$作為開始,指定對應要引用的文件,那些package需要的文件。

 /* specify the files to be included */
 $#include "header1.h"                 // include first header
 $#include "header2.h"                 // include second header

As illustrated, tolua also accepts comments, using C or C++ convention, inside the package file. Nested C-like comments can also be used.

還注意到,文件中的$cfile或$hfile不需要使用該方式,這個tolua自動完成。

在下面的章節,我們將介紹如何指定我們想要綁定到lua的C/C++代碼。這些格式簡單并且符合C/C++的聲明方式。

Binding constants

Tolua支持兩種用于綁定常數的方式:define's和enum's。對于define's的一般格式是:

 #define NAME [ VALUE ]

上面的VALUE是可以選擇的(The value, as showed above, is optional)。如果這樣的代碼出現在要被解析的文件中,tolua會將NAME作為Lua的全局變量,該全局變量是C/C++的常量,值為VALUE。只接受數字常量。

新的tolua++:所有其他預處理指令會被忽略。

對于enum's的一般格式是:

 enum {
   NAME1 [ = VALUE1 ] ,
   NAME2 [ = VALUE2 ] ,
   ...
   NAMEn [ = VALUEn ]
 };

同樣的,tolua創建一系列全局變量,命名為NAMEi,對應values。

Binding external variables

全局外部變量同樣可以暴露出來。在已清理的頭文件(cleaned header file),他們都指定為:

 [extern] type var;

Tolua將這種聲明綁定到Lua的全局變量中。因此,在Lua里,我們可以很自然的訪問C/C++變量。如果變量不是常數,我們還可以在Lua賦予該變量新的值。全局數組同樣可以被綁定到Lua里。數組可以是任意類型。數組對應的Lua類型是table,對應以數字作為下標(indexed with numeric values);但是,要注意的是Lua中下標1對應C/C++中的下標0。數組一定要定長(be pre dimensioned)。例如

double v[10];

新的tolua++:外部變量可以使用tolua_readonly修飾。(see Additional Features)

Binding functions

函數也指定為傳統的C/C++聲明:

 type funcname (type1 par1[, type2 par2[,...typeN parN]]);

返回類型可以是void,表示沒有返回值。函數也可以沒有參數。在這種情況下,void可能被指定到函數的參數列表里(specified in the place of the list of parameters.)。參數類型必須遵循發布(posted)的規則。Tolua創建一個Lua函數綁定C/C++函數。當Lua調用函數時,參數類型必須對應C/C++的類型,否則tolua會產生一個錯誤并報告錯誤參數。如果參數名是省略的,tolua會自定命名,但是類型必須是基本類型或者是以前使用過的用戶定義類型。

Arrays

Tolua同時支持以數組作為參數的函數或方法。最每秒的事情是,當數組映射到lua的table后,當C/C++函數改變了數組里面的值,會實時更新到lua的table中。

數組的大小必須是事先定義好多。例如:

void func (double a[3]);

在tolua里這是一個合法的函數聲明,在lua里調用這個函數方法如:

p = {1.0,1.5,8.6}
func (p)

數組長度不一定是一個常數表達式;還可以是在運行過程中能計算出結果的表達式。例如:

void func (int n, int m, double image[n*m]);

這個是合法的。因為表達式n*m在函數的綁定范圍(expression n*m is valid in the binding function scope)。但是必須考慮到,tolua使用動態分配的方式綁定函數,這一方式會降低性能。

盡管尺寸匹配是必須的,但是更重要的是意識到,所有數組傳遞給實際C/C++函數是,是使用局部變量的方式進行傳遞。因此,如果C/C++函數想要保留這個數組供以后使用,這段代碼可能不會如想象那樣工作。

Overloaded functions

Tolua還支持重載函數。區分兩個同名函數的方法是基于映射到lua的參數類型。因此

void func (int a);
void func (double a);

在C/C++中這代表兩個不同的函數,然而在tolua里它們是同一個函數,因為int和double類型都映射到number。

另一個棘手的情況時,當遇到指針時。假設:

void func (char* s);

 void func (void* p);
 void func (Object1* ptr);

void func (Object2* prt);

盡管在C++中這是4個不同的函數,但是映射到Lua里面的聲明:

func(nil)

重要的是,運行的時候tolua決定那個函數被調用,嘗試映射到那些提供的函數。Tolua第一次嘗試調用最后一個指定的函數;如果失敗,tolua接著嘗試前一個函數。這個過程一直持續到找到一個能成功運行的代碼或者到第一個函數。因為這個原因,不匹配的錯誤信息的發出,總是基于第一個函數的規格(the mismatching error message, when it occurs, is based on the first function specification)。當性能很重要時,我們應該把最常用的函數放在最后一個。

Tolua支持C的重載函數。(see Renaming for details.

Default parameter values

最后的函數參數可以帶有默認值。因此,如果函數調用時提供的參數不足,默認值會自動使用。該格式指定的默認值與C++里面的是一致的。

type funcname (..., typeN-1 parN-1 [= valueN-1], typeN parN [= valueN]);

toLua執行此功能無需使用任何C++的機制;因此,同樣支持綁定C的函數。

我們同樣可以指定數組的默認值(沒有辦法指定一個默認值為數組本身)。例如:

void func (int a[5]=0);

把數組的所有值設為0.因此,這個函數可以直接在lua調用無需初始化table。

對于lua對象類型(lua_Object),tolua定義了一個常量用來指定nil為默認值:

void func (lua_Object lo = TOLUA_NIL);

新的tolua++ :C++類的構造是有效的默認參數。例如:

void set_color(const Color& color = Color(0,0,0));

Multiple returned values

在lua中函數可以返回任意個數的值。Tolua使用這個特性來模擬值傳遞。如果一個函數的參數指定為一個指針或引用的一個基本類型或一個指針或引用的一個指針一個用戶定義的類型,tolua接受對應類型的傳入和返回,除了常規的函數返回,還可以通過參數更新的形式。

例如,考慮用于交換數值的C函數:

void swap (double* x, double* y);

or

void swap (double& x, double& y);

如果這函數在package文件中聲明,tolue綁定該函數為輸入兩個參數,返回兩個值。所以,正確的Lua代碼為:

x,y = swap(x,y)

如果輸入值不使用,lua會自動使用默認參數值調用函數而不需要指定它們。

void getBox (double* xmin=0, double* xmax=0, double* ymin=0, double* ymax=0);

In Lua:

xmin, xmax, ymin, ymax = getBox()

如果是用戶定義類型,則以下面為例:

void update (Point** p);

or

void update (Point*& p);

Binding struct fields

用戶定義類型可以很好的被tolua綁定。對于每一個變量或函數類型,不符合基本類型, tolua自動創建一個標簽的用戶數據代表的C/C++類型。

如果類型對應結構,Lua可以通過下標直接訪問結構里面的內容,indexing a variable that holds an object of such a type. 在C代碼,這些類型通常是用typedef定義的:

 typedef struct [name] {
    type1 fieldname1;
    type2 fieldname2;
    ...
    typeN fieldnameN;
 } typename;

如果這段代碼正在被插入到package文件中,tolua允許任何擁有類型對象名的對象反問任何索引列出的變量的字段名字(If such a code is inserted in the package file being processed, tolua allows any variable that holds an object of type typename to access any listed field indexing the variable by the field name.)。例如,如果var持有對象, var.fieldnamei可以訪問fieldnamei里面的東西

塊內的數組同樣被映射。

typedef struct {
int x[10];
int y[10];
} Example;

Binding classes and methods

Tolua支持C++的類定義。事實上,tolua能很自然的處理單一繼承和多態性。以下各小節將會介紹什么可以暴露給lua,在類定義的時候(The subsections below describe what can be exported by a class definition.)。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区精品视频| 狠狠色狠狠色综合日日小说| 国产伦精品一区二区三区| 久久夜色精品国产欧美乱| 国产综合亚洲精品一区二| 一本色道久久99精品综合| 亚洲高清自拍| 欧美91福利在线观看| 日韩视频中午一区| 校园激情久久| 美女免费视频一区| 一区二区三区久久久| 国产精品嫩草久久久久| 久久精品亚洲| 亚洲一区二区三区精品在线观看| 久久爱另类一区二区小说| 亚洲自拍偷拍色片视频| 亚洲社区在线观看| 亚洲日韩第九十九页| 欧美一区日本一区韩国一区| 欧美a级片一区| 免费视频一区| 久久视频精品在线| 国产精品网站在线观看| 欧美日韩亚洲一区二区| 日韩视频三区| 亚洲精品在线观看视频| 禁久久精品乱码| 国产一区二区三区在线观看精品| 欧美阿v一级看视频| 欧美福利视频| 亚洲你懂的在线视频| 亚洲一区二区欧美日韩| 亚洲天堂男人| 欧美一区二区三区啪啪| 欧美专区福利在线| 免费试看一区| 欧美 日韩 国产在线 | 日韩特黄影片| 欧美影院成人| 在线成人亚洲| 亚洲免费大片| 在线播放豆国产99亚洲| 开元免费观看欧美电视剧网站| 亚洲一区久久久| 亚洲国产导航| 久久本道综合色狠狠五月| 久久久久一本一区二区青青蜜月| 亚洲高清一二三区| 欧美福利小视频| 欧美freesex交免费视频| 亚洲美女黄色片| 宅男噜噜噜66一区二区66| 亚洲欧美另类在线观看| 亚洲一区免费网站| 欧美大学生性色视频| 亚洲国产日韩在线一区模特| 欧美一区二区三区在线播放| 欧美插天视频在线播放| 久久综合狠狠综合久久综合88| 欧美暴力喷水在线| 中日韩视频在线观看| 久久成人亚洲| 先锋a资源在线看亚洲| 久久亚洲欧美| 亚洲欧美成人综合| 亚洲欧美日韩国产精品| 欧美国产日韩a欧美在线观看| 亚洲欧美成人| 久久国产精品99国产精| 久久九九热免费视频| 欧美精品一区二区三区久久久竹菊 | 国产精品高潮呻吟久久av黑人| 欧美夫妇交换俱乐部在线观看| 国产日本欧美一区二区| 国内精品伊人久久久久av一坑| 国产亚洲欧美日韩精品| 夜色激情一区二区| 久久精品国产清自在天天线| 一色屋精品亚洲香蕉网站| 亚洲人成免费| 嫩模写真一区二区三区三州| 欧美伊人久久| 国产精品久久久久aaaa樱花| 亚洲无限av看| 在线午夜精品| 国产乱子伦一区二区三区国色天香| 亚洲直播在线一区| 亚洲午夜精品一区二区| 国产精品任我爽爆在线播放| 亚洲欧美综合精品久久成人| 欧美黑人国产人伦爽爽爽| 久久人人爽国产| 影音先锋中文字幕一区| 久久一综合视频| 老司机免费视频一区二区| 在线激情影院一区| 亚洲激情视频| 欧美日韩国产一区精品一区 | 欧美一区精品| 亚洲一区二区三区色| 欧美风情在线观看| 日韩视频免费观看高清完整版| 欧美国产精品劲爆| 欧美日韩国产一区二区| 国产精品美女久久福利网站| 在线视频一区观看| 久久久九九九九| 亚洲国产精品女人久久久| 欧美sm视频| 亚洲午夜电影| 欧美一区二区三区的| 亚洲欧洲视频| 一本色道久久综合精品竹菊| 国产精品久久久久久久免费软件 | 亚洲一区999| 欧美一区二区大片| 亚洲第一区在线观看| 亚洲激情视频网| 国产日韩在线一区二区三区| 欧美成人tv| 国产精品久久网站| 亚洲国产精品小视频| 国产精品免费网站在线观看| 免费看的黄色欧美网站| 欧美三级电影精品| 亚洲欧美日韩精品综合在线观看| 久久精彩免费视频| 欧美一区二区国产| 欧美体内谢she精2性欧美| 亚洲精品乱码| 亚洲免费精彩视频| 欧美精品在线观看91| 亚洲国产一区二区三区高清| 亚洲区中文字幕| 欧美激情一区在线| 亚洲毛片在线免费观看| 亚洲视频大全| 国产精品一区二区三区乱码| 亚洲一区二区三区精品动漫| 国产日韩综合一区二区性色av| 亚洲国产精选| 亚洲日本成人网| 欧美精品一区二区三区蜜桃 | 久久久久久自在自线| 国产亚洲精品综合一区91| 亚洲欧美激情一区二区| 欧美色道久久88综合亚洲精品| 亚洲精品在线观看视频| 欧美日韩一区精品| 欧美日韩亚洲一区二区三区在线观看| 亚洲精品老司机| 亚洲视频香蕉人妖| 国产精品久久久久久一区二区三区| 亚洲午夜性刺激影院| 亚洲专区一区| 国产欧美日韩精品a在线观看| 欧美在线观看你懂的| 老司机午夜精品视频在线观看| 亚洲高清久久| 欧美视频成人| 欧美伊人久久| 亚洲精品一区二区三区在线观看 | 伊人久久婷婷| 欧美成年人视频网站| 亚洲美女中文字幕| 136国产福利精品导航网址| 欧美成人69av| 在线亚洲欧美专区二区| 久久久久se| 亚洲精品少妇网址| 国产麻豆视频精品| 你懂的国产精品| 亚洲激情成人在线| 香蕉亚洲视频| 亚洲精品在线视频| 国产亚洲激情在线| 欧美美女bb生活片| 欧美一区国产在线| 一区二区三区色| 亚洲国产欧洲综合997久久| 欧美一区二区私人影院日本| 亚洲精品国产欧美| 国产一区二区三区丝袜| 欧美日韩亚洲一区三区| 久久婷婷久久| 亚洲欧美色婷婷| 亚洲精品日韩一| 国模吧视频一区| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 久久综合狠狠综合久久综合88| 亚洲乱码视频| 欧美aⅴ一区二区三区视频| 亚洲欧美日韩一区二区三区在线观看 | 欧美日本不卡视频| 久久久精品国产免费观看同学| 亚洲一区二区久久| 亚洲人久久久| 欧美激情一区二区三区在线视频观看 | 欧美激情精品久久久久久黑人 |