2010-12-18 63 views
2

在我的C++頭文件,我有以下幾點:替代空宏

#ifdef _DLL 
#define DLL_API __declspec(dllexport) // Being compiled as a DLL. 
#else 
#define DLL_API // Not being compiled as a DLL. 
#endif 

後來,我有事情,如:

DLL_API int GetNumber(); 

我簡單化,但基本的問題在這裏如果沒有定義,是否有辦法讓編譯器跳過DLL_API

回答

4

當DLL_API被定義爲包含任何預處理,然後替換DLL_API什麼也沒有和編譯器會看到什麼也沒有預處理宏。如果預處理器未定義,則預處理器不執行任何操作。然後編譯器會看到它不變,並且你得到關於未知標識符DLL_API的編譯器錯誤,因爲這樣的東西不是C++語言的一部分。

像__declspec()這樣的屬性是特定於平臺的擴展,常用慣例是將它們在接口中的使用封裝到預處理器宏中。

1

通常情況下,它是

#ifdef _WIN32 
#ifdef _DLL 
#define DLL_API __declspec(dllexport) // Being compiled as a DLL. 
#else 
#define DLL_API __declspec(dllimport) // Not being compiled as a DLL. 
#endif 
#else 
#define DLL_API 
#endif 

,使其便攜,DLL_API總是轉化爲某種有效。

+0

我的版本在Xcode下編譯。有什麼我失蹤? – Maxpm 2010-12-18 19:16:46

+0

使用你的DLL的(Windows)程序將需要__declspec(dllimport)。 – 2010-12-18 19:18:38

+0

其實你必須做更多的事情:每個庫都需要一個唯一的標識符,即_A_DLL .. _B_DLL_,如果你真的在Windows上但是做一個靜態鏈接,那麼你就不會使用_WIN32。 – Yttrill 2010-12-18 20:27:41