2009-05-29 141 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是无意义的。

有时只导出一组有限的类的功能是比较合适的;那么后一种形式是优选的。请注意,在你的情况下,'自动'生成的析构函数将不会被导出。