dllimport静态数据成员的C ++定义

时间:2010-08-16 09:34:58

标签: c++ dll static static-members

我的课程如下所示:

//.h file
class __declspec(dllimport) MyClass
{
    public:
    //stuff
    private:

    static int myInt;
};

// .cpp file
int MyClass::myInt = 0;

我收到以下编译错误:

error C2491: 'MyClass::myInt' : definition of dllimport static data member not allowed

我该怎么办?

3 个答案:

答案 0 :(得分:29)

__declspec(dllimport)表示当前代码使用实现您的类的DLL。因此,在DLL中定义了成员函数和静态数据成员,并在程序中再次定义它们是一个错误。

如果您正在尝试编写实现此类的DLL的代码(从而定义成员函数和静态数据成员),那么您需要标记类__declspec(dllexport)

通常使用宏来实现此目的。构建DLL时,您可以定义宏BUILDING_MYDLL或类似的。在MyClass的标题中,您有:

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

    class MYCLASS_DECLSPEC MyClass
    {
        ...
    };

这意味着您可以在DLL和使用DLL的应用程序之间共享标头。

答案 1 :(得分:4)

来自MSDN Documentation

  

当你声明一个类dllimport时,   其所有成员函数和静态   数据成员已导入。不像   dllimport和dllexport的行为   非类型,静态数据成员   无法在中指定定义   一个dllimport的同一个程序   class已定义

希望有所帮助......

答案 2 :(得分:0)

如果您要导入一个类,那么您要导入它的所有成员,因此无法在“客户端”定义任何类成员。应该代表实现dll使用dllexport关键字