2011-01-11 31 views
1

一起使用時,我嘗試爲C++ struct定義一個構造函數,並且同時這也是我想要導出的結構。因此,這裏是我的代碼:結構不能採取構造函數與__declspec(dllexport)

extern "C"__declspec(dllexport) typedef struct 
{ 
    double x; 
    double y; 

    PointCg(double xx, double yy); 
}PointCg; 

但是,我得到一個編譯錯誤說

錯誤C4430:缺少類型specifier- INT假設。注意:C++不支持default-int

但我認爲這是一個完全有效的聲明?

我使用visual-C++ 2008,如果它對你很重要。

回答

2

typedefs只是基本類型的別名。這意味着typedefs是編譯時間,而不是鏈接時間構造。

在您的示例代碼中,您試圖對匿名結構的typedef進行解析 - 這會在兩個層面上混淆編譯器:首先,您正在導出一個不想執行的別名,接下來,結構本身是匿名的,所以它甚至不能導出它。第三,看起來像構造函數的東西不是。它只是一個奇怪名稱的功能。 ctor必須具有結構的名稱,以及匿名。

鑑於這種問題是C++使用結構時......你爲什麼不只是跳過的typedef,並給予該結構的名稱,其輕鬆了很多的規則:

extern "C"__declspec(dllexport) struct PointCg 
{ 
    double x; 
    double y; 
    PointCg(double xx, double yy); 
}; 
3

__declspec沒有任何關係與它做。你正在定義一個匿名結構。 typedef名稱不適用於定義構造函數。在定義中,PointCg只是看起來像一個函數名稱,函數必須具有返回類型。這是你如何在C++中定義一個結構:

struct PointCg{ 
    //.... 
    PointGc(double xx, double yy); 
}; 

不像C,你不需要typedef結構名稱,以避免打字struct四起,指的是類型時,可以只使用PointCg代替struct PointCg

1

錯誤C4430:mising類型說明符int假定。注意:C++不支持default-int

這通常意味着您引入了一個對編譯器沒有任何意義的名稱。事實上,我相信這是這種情況。您正在使用古老的C技術來定義結構:typedef struct。當編譯器到達(至今未命名的)結構的構造函數時,PointCg名稱並不意味着什麼。在typedef以關閉}命名之前,它沒有任何意義。

我建議你改變你的代碼如下:

extern "C"__declspec(dllexport) struct PointCg 
{ 
    double x; 
    double y; 

    PointCg(double xx, double yy); 
}; 

在C++中,有從字面上從來沒有理由去使用舊typedef struct技術。這隻會導致痛苦和困惑,並沒有得到任何東西。