C ++/WinRT 配置宏
本主题介绍 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 时,将启用可视化支持函数。 有关更多详细信息,请参阅适用于 C++/WinRT 的 Visual Studio 本机调试可视化 (natvis)。
你可以将具有不同设置的文件组合在一起,比如 WINRT_NATVIS。
如果任何文件在具备 WINRT_NATVIS 支持的情况下编译,则生成的模块将启用本机调试可视化功能。
WINRT_EXPORT、WINRT_FAST_ABI_SIZE
请勿使用这些宏。