2013-05-21 61 views
4

我正在爲我的一個項目構建一個C++ DLL。我試圖將類的方式標準化。因此,而不是每次都寫:使用#define宏標準化類聲明

class __declspec(dllexport) ClassName 

我建立一個#define宏來緩解這一過程:

#define CLASS(cName) class __declspec(dllexport) cName 

但是,當我使用它,它給了我下面的錯誤:

Error: Expected a ';' 

我知道你可以使用一個#define宏來定義整個類的創作,但它可以被用來定義只有「類的頭」?

感謝,

請記住,我想這樣做,因爲我們要處理幾百個類,所以這些類型的「自動化」將是最有幫助:)

編輯:

例如:

#define CLASS(nClass) class __declspec(dllexport) nClass 

CLASS(APTest) 
{      // Here is the error of missing ';' 
public: 
    APTest(); 
}; 
+1

在宏調用之前或之後,您遇到語法錯誤。如果沒有看到更多的上下文,就無法分辨究竟是什麼 – Mat

+0

你能舉一個你如何使用這個'CLASS'宏的例子嗎?也許這是一個簡單的使用錯誤? –

+0

你可以在這個用法上方顯示代碼嗎? –

回答

14

不要這樣做。

C++已經標準化!

如果您希望其他人閱讀您的代碼,那麼只需使用傳統C++編寫代碼,而不是一些看起來不同的homecooked方言。習慣適當的C++語法,這將使讀取其他人的C++代碼更容易。

一兩件事,有一定道理是簡化__declspec部分,你可以這樣做:

#ifdef _WIN32 
#define DLLEXPORT __declspec(dllexport) 
#else 
#define DLLEXPORT 
#endif 

class DLLEXPORT APTest 
{ 
    // ... 
}; 

你真的不寫CLASS(APTest)讓你的生活再簡單不過,你使它更難別人去了解。拒絕吧。

+0

嗯...實際上有很大的意義,我實際上是在試圖簡化這個__declspec(dllexport)命令,謝謝你的建議! – nevero

+0

+100:The –

1

還有比@Wakely更好的方法。像這樣做:

#ifdef MYLIB_DLL 

#ifndef MYLIB_IFACE 
#ifdef MYLIB_IFACE_EXPORT 
#define MYLIB_IFACE _declspec(dllexport) 
#else // !MYLIB_IFACE_EXPORT 
#define MYLIB_IFACE _declspec(dllimport) 
#endif // !MYLIB_IFACE_EXPORT 
#endif // !MYLIB_IFACE 

#else // !MYLIB_DLL 

#ifndef MYLIB_IFACE 
#define MYLIB_IFACE 
#endif // !MYLIB_IFACE 

把這樣的一個塊是在DLL中使用的每一個文件頭,併爲您的DLL公共頭。

應該從您的DLL導出每一個符號被標記的是這樣的:

class MYLIB_IFACE MyClass 
{ 
}; 

void MYLIB_IFACE myFunc(); 

然後在你的DLL的每個.cpp文件的第一行應該是:

#define MYLIB_IFACE_EXPORT 

如果你這樣做這個,那麼它將在不使用dllexport/dllimport的POSIX系統上構建得很好。爲了構建你的lib的dll版本,你需要定義MYLIB_DLL。 (你可以在編譯器的標記中這樣做,以便可以從你的編譯系統中進行控制)

要構建lib的靜態版本,請不要定義MYLIB_DLL。

@Update:

您可以擴展這種支持GCC visilibity這樣的:

#ifdef WIN32 
#define KX_SYMBOL_EXPORT _declspec(dllexport) 
#define KX_SYMBOL_IMPORT _declspec(dllimport) 
#else // GCC 
#define KX_SYMBOL_EXPORT __attribute__((visibility ("default"))) 
#define KX_SYMBOL_IMPORT 
#endif 

#ifdef KX_DLL 

#ifndef KX_IFACE 
#ifdef KX_IFACE_EXPORT 
#define KX_IFACE KX_SYMBOL_EXPORT 
#else // !KX_IFACE_EXPORT 
#define KX_IFACE KX_SYMBOL_IMPORT 
#endif // !KX_IFACE_EXPORT 
#endif // !KX_IFACE 

#else // !KX_DLL 

#ifndef KX_IFACE 
#define KX_IFACE 
#endif // !KX_IFACE 

#endif // !KX_DLL 

我刪除了GCC位在第一個例子中的簡單。但這是真的如何做到這一點。 @Wakely是如此的正確。

+0

'MYLIB_DLL_EXPORT'是'MYLIB_IFACE_EXPORT'還是反之亦然?爲了更好的使用GCC的[visibility](http://gcc.gnu.org/wiki/Visibility)屬性來實現類似的效果一些POSIX平臺 –

+0

如此精明。是的,爲了增加海灣合作委員會的善良,你應該使用可見性屬性。我在這裏簡單地介紹了我的生產代碼。再次關於MYLIB_DLL_EXPORT。固定。 –

+0

現在這是一個很好的答案,謝謝! –