Подтвердить что ты не робот

С++ определение статического элемента данных dllimport

У меня есть класс, который выглядит следующим образом:

//.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

что мне делать?

4b9b3361

Ответ 1

__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.

Ответ 2

От Документация MSDN,

Когда вы объявляете класс dllimport, все его функции-члены и статические данные импортируются. в отличие от поведение dllimport и dllexport на типы nonclass, статические элементы данных не может указывать определение в та же программа, в которой dllimport класс определяется.

Надеюсь, что это поможет.

Ответ 3

если вы импортируете класс, который вы импортируете его со всеми его членами, поэтому невозможно определить какого-либо члена класса на стороне клиента. Ключевое слово dllexport должно использоваться от имени реализации dll