簡體   English   中英

檢查預處理器中的__declspec宏

[英]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。


實際上,這要涉及更多一點。

  1. 大多數項目具有多個DLL。 BUILD_DLL無法正常工作。 您將為每個生成的DLL需要BUILD_xxx_DLL 假設您有兩個DLL,即實用程序和核心。 以及依賴於兩者的應用程序。

  2. 您可能還需要創建一個靜態庫。

在實用程序庫的每個公共.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_STATICBUILD_UTILITY_DLL未定義狀態。

utility.lib(靜態庫)的用戶將需要定義BUILD_UTILITY_STATIC並保留BUILD_UTILITY_DLL未定義。

對於core.dll和core.lib,您將需要一個類似的文件。

該宏由DLL創建者命名。

  • 您想要一個可以在導出或導入模式下工作的頭文件。
  • 將使用AC / C ++文件創建程序,以構建DLL(導出)。
  • 其他C / C ++文件將用於調用DLL(導入函數)。

在構建實現​​文件中,在包含頭之前定義了您所命名的宏。 例如

#define DLLNAME_BUILD_DLL
#include "dll_header.h"

在標題中,如果定義了宏,則將模式設置為導出。 使用DLL時,未定義宏,並且導入了函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM