在包含其自身类型的静态成员的类中使用 __declspec(dllimport)

Using __declspec(dllimport) in a class containing a static member of its own type

本文关键字:declspec dllimport 包含其 类型 静态成员      更新时间:2023-10-16

我有一个类,它的标题看起来像这样:

class MYCLASS_DECLSPEC MyClass
{
    MyClass(int x);
    ....
    static const MyClass Zero;
}

在实现文件上,我初始化了静态 const 成员:

const A A::Zero(0);

现在我想将此代码有时编译为 DLL,有时编译为静态库。通常的做法是像这样定义MYCLASS_DECLSPEC:

#ifdef BUILDING_MYDLL
#define MYCLASS_DECLSPEC __declspec(dllexport)
#else
#define MYCLASS_DECLSPEC __declspec(dllimport)
#endif

当我将此代码编译为 DLL(定义了 BUILDING_MYDLL)时,一切正常。但是当我将此代码编译为静态库(未定义BUILDING_MYDLL)时,出现以下错误:

error: definition of static data member 'MyClass::Zero' of dllimport'd class

如果我完全删除__declspec(dllimport),代码将成功编译为静态库。

我在Windows 7上使用mingw32编译器。

有人可以解释为什么会发生这种情况以及如何解决它吗?

我认为

我们将 #defines 放在另一个 #define 中:

#ifdef _DLL
#ifdef BUILDING_MYDLL
#define MYCLASS_DECLSPEC __declspec(dllexport)
#else
#define MYCLASS_DECLSPEC __declspec(dllimport)
#endif
#else
#define MYCLASS_DECLSPEC
#endif