2010-08-16 57 views
17

的定義,我有一個類,它看起來象下面這樣:C++ 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 

我該怎麼辦?

回答

25

__declspec(dllimport)意味着當前的代碼是使用實現類的DLL。成員函數和靜態數據成員因此在DLL中定義,並且在程序中再次定義它們是錯誤的。

如果您正在嘗試編寫實現此類的DLL的代碼(因此定義了成員函數和靜態數據成員),則需要標記類__declspec(dllexport)

這是常見的使用宏。在構建DLL時,您可以定義一個宏BUILDING_MYDLL或類似的宏。在您的標題爲MyClass你就必須:

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

class MYCLASS_DECLSPEC MyClass 
{ 
    ... 
}; 

這意味着你可以共享DLL和使用該DLL的應用程序之間的標題。

+1

這是在[Microsoft的頁面]上的相應引用(http://msdn.microsoft.com/de-de/library/8fskxacy.aspx):「在函數聲明中使用__declspec(dllimport)是可選的[... ]。但是,您必須使用__declspec(dllimport)作爲導入可執行文件來訪問DLL的公共數據符號和對象。請注意,您的DLL的用戶仍然需要鏈接到導入庫。 – 2014-10-09 11:04:19

0

如果你正在導入一個你正在將它導入它的所有成員的類,所以不可能在「客戶端」定義任何類成員。 DLLEXPORT關鍵字應代表執行DLL

4

MSDN Documentation的使用,

When you declare a class dllimport, all its member functions and static data members are imported. Unlike the behavior of dllimport and dllexport on nonclass types, static data members cannot specify a definition in the same program in which a dllimport class is defined.

希望它可以幫助..