C++ 两个DLL声明之间的差异

C++ 两个DLL声明之间的差异,c++,dll,C++,Dll,我有一个简单但微妙的问题。下面,您可以从DLL头文件中看到同一类的两个不同声明变量 有人能告诉我这类声明的区别吗 class __declspec(dllexport) Car { public: Car(); void drive(void); typedef enum { None, Indented } Formatting; } 从这个开始 class Car { public: __declspec(dllexport) Car(); __d

我有一个简单但微妙的问题。下面,您可以从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;
}
在第一个声明中,类本身是gets _declspec(dllexport),而在后一种情况下,每个类元素都是单独声明的


它们是不同的还是有什么共同点?

导出类是导出其所有公共函数的缩写

因此,区别在于
格式
枚举的
declspec
是无意义的

有时只导出类的一组有限功能更合适;那么后一种形式将是首选。请注意,在您的情况下,“自动”生成的析构函数将不会导出。

使用的简短测试表明,与第二个示例相比,第一个示例会导出一个额外的符号(顺便说一句,您不导出枚举,这是不合法的)。如果我没有错的话,我相信这是默认的赋值运算符

第一种方法导出整个类,第二种方法只导出以declspec为前缀的方法(我想这并不奇怪)


所以我要说,导出类的正确方法显然是第一种方法,就我个人而言,我还没有看到任何导出类使用第二种方法。

我们曾经使用过第二种方法。原因是,导出的类是从模板类派生的,有些东西失败了(VC 2005)。感谢您的回答,它对我帮助很大