本主題描述 C++/WinRT 的設定巨集。 除非另有說明,以下規則適用於所有 C++/WinRT 設定巨集:
- 所有連結成單一模組(
.exe或.dll)的檔案必須擁有相同的巨集設定。 這也包括靜態函式庫。 - 必須先完成所有巨集設定,才能包含任何 C++/WinRT 標頭檔。
- 在包含任何 C++/WinRT 標頭檔之後,你不得變更任何巨集設定。
WINRT_LEAN_AND_MEAN
若定義為此,則會停用以下罕見功能(以縮短編譯時間):
- 在元件之外實作專屬介面的能力。
- 介面與執行時類別智慧指標的 Std::hash 專精化。
- 自版本 2.0.221101.3 起,支援直接輸出 hstring 或 IStringable 到 C++ 串流。
你可以合併對 WINRT_LEAN_AND_MEAN 採用不同設定的檔案。
不定義 WINRT_LEAN_AND_MEAN 的檔案則能存取那些很少使用的特性。
WINRT_NO_MODULE_LOCK
若定義,則會停用目前模組的物件計數。 模組永遠不會從程序中卸載。 對於執行檔(其永遠不會卸載),或是你打算讓其保持固定載入狀態的 .dll,通常都會定義這個巨集。 可能無法與 WINRT_CUSTOM_MODULE_LOCK合併使用。
WINRT_CUSTOM_MODULE_LOCK
若有定義,可讓您提供自己的 winrt::get_module_lock 實作。 可能無法與 WINRT_NO_MODULE_LOCK合併使用。
您自訂的 winrt::get_module_lock 實作必須支援以下操作:
-
++winrt::get_module_lock():增加模組鎖的參考數量。 -
--winrt::get_module_lock():減少模組鎖的參考計數。 -
if (winrt::get_module_lock())檢查參考點數是否非零。 (如果你要建置 DLL,則需要此項。)
WINRT_ASSERT,WINRT_VERIFY
這些巨集可讓您自訂斷言的處理方式。 WINRT_ASSERT 不要求論點被評估。 WINRT_VERIFY 要求該參數必須被評估,即使是在非除錯編譯中也是如此。
如果你未自訂這些巨集,且已定義 _DEBUG,那麼 C++/WinRT 會將它們視為等同於 _ASSERTE。
如果你沒有自訂這些巨集,且 _DEBUG 沒有定義,那麼 C++/WinRT 會定義 WINRT_ASSERT 捨棄未評估的表達式,並定義在評估後丟棄表達式的 WINRT_VERIFY 。
WINRT_NO_MAKE_DETECTION
如果有定義,會停用預設的 C++/WinRT 診斷,該診斷會偵測你錯誤地建構了未使用 winrt::make 的實作類別。
我們強烈建議你不要定義這個符號,因為這麼做會掩蓋常見的程式錯誤來源。
WINRT_NO_SOURCE_LOCATION
若有定義,則在引發錯誤時,會停用原始檔案與行號資訊(以及除錯編譯中的功能資訊)。
這些額外資訊不會被 C++/WinRT 使用,但會提供給其他希望與 C++/WinRT 例外互通的函式庫,例如 Windows 實作函式庫。
預設情況下,當以 C++20 或更高版本編譯時,這些資訊會被包含在內。 你可能想抑制這些資訊以減少二進位大小。
WINRT_DIAGNOSTICS
若定義,則可利用內部統計追蹤各種操作:
- 每個介面被查詢的次數。
- 每個工廠被請求的次數(以及該工廠是否具備敏捷性)。
WINRT_NATVIS
如有定義,包含輔助功能以協助 Visual Studio 的原生除錯視覺化。 這段程式碼不會在執行階段使用;它僅供除錯使用。
如果你沒有自訂這個巨集,那麼只要 _DEBUG 定義好,視覺化支援功能就會被啟用。 更多細節請參閱 Visual Studio 原生除錯視覺化(natvis)針對 C++/WinRT。
你可以把不同設定的檔案合併成 WINRT_NATVIS。
若任何檔案以 WINRT_NATVIS 支援編譯,則該模組將啟用原生除錯視覺化功能。
WINRT_EXPORT, WINRT_FAST_ABI_SIZE
不要使用這些巨集。