【问题标题】:Difference between two DLL declarations两个 DLL 声明之间的区别
【发布时间】:2009-05-29 14:13:22
【问题描述】:

我有一个简单但微妙的问题。下面您会看到来自 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),而在后一种情况下,每个类元素都是单独声明的。

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

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

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

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

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

    【讨论】:

    • 我们不得不使用第二种方法一次。原因是,导出的类是从模板类派生的并且失败了(VC 2005)
    • 感谢您的回答,它对我帮助很大
    【解决方案2】:

    导出类是导出所有公共函数的简写。

    所以区别在于__declspec 的Formatting 枚举是无意义的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-20
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多