[英]Check a __declspec macro in preprocessor
如果我有被定義為__declspec(dllimport)
或__declspec(dllexport)
SOME_MACRO
,有沒有辦法在編譯時檢查正在使用哪個?
即是這樣的:
#if SOME_MACRO == __declspec(dllimport)
// do something
#else
// do something else
#endif
UPD。 看得到的答案,我想我應該為什么要這樣做更具體。
我正在嘗試編譯一個相當大的第三方庫,該庫在其包含代碼的大部分代碼中都聲明為dllexport
。 但是,其中有一個組件是dllimport
。
對於dllimport
情況,我需要稍作修改聲明。 這兩個聲明之間的切換不是很簡單,這是因為#ifdef
指令的樹很深,分布在多個文件中。 原則上,我可以從這些說明中挖掘此信息,但為確保正確執行,我必須嘗試在幾種不同的配置下編譯整個庫(每次編譯需要幾個小時)。
另一方面,如果有一種簡單的方法可以檢查是否評估了它們的SOME_MACRO
是導入還是導出,那么我可以在一個小程序上對此進行快速安全地測試。
你不能使用
#if SOME_MACRO == __declspec(dllimport)
__declspec(dllimport)
不是預處理程序表達式的有效標記。
最好的選擇是使用另一個預處理器宏,例如:
// Are we building the DLL?
#if defined(BUILD_DLL)
// Yes, we are.
#define SOME_MACRO __declspec(dllexport)
#else
// No. We are using the DLL
#define SOME_MACRO __declspec(dllimport)
#endif
現在,您可以使用:
#if defined(BUILD_DLL)
包括條件代碼,具體取決於您是在構建DLL還是使用DLL。
實際上,這要涉及更多一點。
大多數項目具有多個DLL。 BUILD_DLL
無法正常工作。 您將為每個生成的DLL需要BUILD_xxx_DLL
。 假設您有兩個DLL,即實用程序和核心。 以及依賴於兩者的應用程序。
您可能還需要創建一個靜態庫。
在實用程序庫的每個公共.h文件中,您都需要類似以下內容的東西。
#if defined(BUILD_UTILITY_STATIC)
#define UTLIITY_EXPORT
#elif defined(BUILD_UTILITY_DLL)
#define UTLIITY_EXPORT__declspec(dllexport)
#else
#define UTLIITY_EXPORT__declspec(dllimport)
#endif
當然,您不需要在許多.h文件中重復相同的代碼。 您將創建一個包含上述內容的.h文件,並在所有其他.h文件中#include
該文件。
BUILD_UTILITY_DLL
,您需要定義BUILD_UTILITY_DLL
並將BUILD_UTILITY_STATIC
保留BUILD_UTILITY_STATIC
未定義狀態。
在構建utllity.lib(靜態庫)時,您將需要定義BUILD_UTILITY_STATIC
並將BUILD_UTILITY_DLL
未定義狀態。
utility.dll用戶將使BUILD_UTILITY_STATIC
和BUILD_UTILITY_DLL
未定義狀態。
utility.lib(靜態庫)的用戶將需要定義BUILD_UTILITY_STATIC
並保留BUILD_UTILITY_DLL
未定義。
對於core.dll和core.lib,您將需要一個類似的文件。
該宏由DLL創建者命名。
在構建實現文件中,在包含頭之前定義了您所命名的宏。 例如
#define DLLNAME_BUILD_DLL
#include "dll_header.h"
在標題中,如果定義了宏,則將模式設置為導出。 使用DLL時,未定義宏,並且導入了函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.