web-dev-qa-db-fra.com

Définition C++ du membre de données statique dllimport

J'ai une classe qui ressemble à celle ci-dessous:

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

    static int myInt;
};

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

J'ai l'erreur de compilation suivante:

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

que devrais-je faire?

18
MBZ

__declspec(dllimport) signifie que le code actuel est utilise le DLL qui implémente votre classe. Les fonctions membres et les membres de données statiques sont ainsi définis dans la DLL et leur nouvelle définition dans votre programme est une erreur.

Si vous essayez d'écrire le code pour la DLL qui implémente cette classe (et définit ainsi les fonctions membres et les membres de données statiques), vous devez marquer la classe __declspec(dllexport) à la place.

Il est courant d'utiliser une macro pour cela. Lors de la construction de votre DLL, vous définissez une macro BUILDING_MYDLL ou similaire. Dans votre en-tête pour MyClass, vous avez alors:

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

class MYCLASS_DECLSPEC MyClass
{
    ...
};

Cela signifie que vous pouvez partager l'en-tête entre DLL et l'application qui utilise la DLL.

28
Anthony Williams

De Documentation MSDN ,

Lorsque vous déclarez une classe dllimport, Toutes ses fonctions membres et des membres statiques Sont importés. Contrairement au comportement De dllimport et de dllexport sur les types Non classés, les membres de données statiques Ne peuvent spécifier une définition dans le même programme Dans lequel un dllimport classe est définie .

J'espère que ça aide..

4
liaK

si vous importez une classe, vous l'importez avec tous ses membres. Il est donc impossible de définir un membre de classe du "côté client". Le mot clé dllexport doit être utilisé au nom de la DLL de mise en oeuvre.

0
user396672