2009-05-29 139 views
2

我有一個簡單但微妙的問題。下面你會看到DLL頭文件中的同一個類的兩個不同的聲明變體。兩個DLL聲明之間的區別

有人可以告訴我這個類聲明的區別嗎?

class __declspec(dllexport) Car { 
public: 
    Car(); 
    void drive(void); 
    typedef enum { None, Indented } Formatting; 
} 

從這個?

class Car { 
public: 
    __declspec(dllexport) Car(); 
    __declspec(dllexport) void drive(void); 
    __declspec(dllexport) typedef enum { None, Indented } Formatting; 
} 

在第一個聲明,類本身是得到__declspec(dllexport)的,而在後一種情況下,每個類元件被聲明單獨如此。

他們有什麼不同或者他們有什麼共同點?

回答

4

使用depends進行的簡短測試顯示,第一個示例與第二個示例相比導出了一個附加符號(順便說一下,您不會導出枚舉,這不合法)。如果我沒有錯,我相信它是默認的賦值運算符。

第一種方法導出整個類,第二種方法只是以declspec爲前綴的方法(我猜這裏沒有意外)。

所以我會說導出一個類的正確方法顯然是第一個,我個人沒有看到任何導出的類使用第二種方法。

+0

我們不得不使用第二種方法一次。原因是,導出的類是從模板類派生的,並且失敗了(VC 2005) – 2009-05-29 15:56:31

1

導出一個類是導出所有公共函數的簡寫。

所以差異在於枚舉的__declspec是無意義的。

有時只導出一組有限的類的功能是比較合適的;那麼後一種形式是優選的。請注意,在你的情況下,'自動'生成的析構函數將不會被導出。