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

请勿使用这些宏。