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

C++混合編程之idlcpp教程Lua篇(3),idlcpplua

編輯:C++入門知識

C++混合編程之idlcpp教程Lua篇(3),idlcpplua


 上一篇 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語句。

 

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