上一篇 C++混合編程之idlcpp教程Lua篇(2) 是一個 hello world 的例子,僅僅涉及了靜態函數的調用。這一篇會有新的內容。
與LuaTutorial0相似,工程LuaTutorial1中,同樣加入了三個文件LuaTutorial1.cpp, Tutorial1.i, tutorial1.lua。其中LuaTutorial1.cpp的內容基本和LuaTutorial0.cpp雷同,不再贅述。首先看一下Tutorial1.i的內容:
namespace tutorial { struct Point { float x; float y; meta: Point(); }; }
編譯後生成的Tutorial1.h的內容如下:
//DO NOT EDIT THIS FILE, it is generated by idlcpp //http://www.idlcpp.org #pragma once namespace tutorial{ struct Point; } namespace tutorial { struct Point { public: float x; float y; public: static Point* New(); static Point* NewArray(unsigned int count); }; }
編譯後生成的Tutorial1.ic的內容如下:
//DO NOT EDIT THIS FILE, it is generated by idlcpp //http://www.idlcpp.org #pragma once #include "Tutorial1.h" #include "Tutorial1.mh" #include "../../paf/src/pafcore/RefCount.h" namespace tutorial { inline Point* Point::New() { return new Point(); } inline Point* Point::NewArray(unsigned int count) { return new_array<Point>(count); } }
上面生成的代碼中有一些是多余的,待以後改進編譯器再來消除這些多余的代碼。
struct Point 定義了一個結構體。
下面兩行
float x;
float y;
表示其中有兩個float類型的數據成員x和y。
然後下一行
meta:
這是idlcpp特有的關鍵字,在C++中沒有對應的存在。如上所述,idlcpp編譯.i文件生成對應頭文件代碼同時,還會生成元數據代碼。比如上面這行代碼
float x;
idlcpp在tutorial1.h中生成了同樣的成員聲明,同時在元數據代碼中也有對應的代碼生成。但是有時候,我們只希望在元數據中生成相應代碼,而頭文件中不需要有對應的代碼。或者是相反的情形,即只希望在頭文件中生成相應代碼,而元數據中不需要有對應的代碼。為應對這些情況,idlcpp提供了三個關鍵字native,meta,all。用法和C++類聲明中的public, protected, private用法類似。即在struct 或 class中以
native:
meta:
all:
三種形式出現,影響其後的成員聲明,直到遇到下一個相應的關鍵字。其中native表示只在頭文件中生成對應的代碼,不在元數據中生成,meta表示只在元數據中生成對應代碼,不在頭文件中生成。all表示在頭文件和元數據中都生成對應代碼。默認值為all。此處meta關鍵字影響下面的這行代碼
Point();
即在頭文件中不需要默認構造函數的聲明,從而也無需在外面寫一個默認構造函數的實現。此處需要在元數據中生成對應的代碼基於下面的規定:
然後看一下腳本tutorial1.lua的內容:
pt = paf.tutorial.Point.New(); pt.x = 1; pt.y = 2; print(pt.x); print(pt.y); print(pt.x._); print(pt.y._);
編譯運行結果如下圖:
第一行
pt = paf.tutorial.Point.New();
是new一個 Point對象,變量pt保存其引用。
相當於C++中的 ::tutorial::Point* pt = new ::tutorial::Point();
下面兩行
pt.x = 1;
pt.y = 2;
相當於C++中的
pt->x = 1;
pt->y = 2;
下面兩行print輸出結果即上圖的前兩行。在使用idlcpp時,C++中的任何類型(包括原生類型如int, float等)在lua中都是userdata。要將C++原生類型轉換到lua中對應的類型需使用._語法,參看最後兩行print語句。