cppwinrt.exe 工具如何知道使用哪个 C++ 版本从 .winmd 文件生成 headers?

How cppwinrt.exe tool know which C++ version to use to generate the headers from .winmd files?

我在 cppwinrt.exe 工具中没有看到任何指定“C++ 版本”的开关!

(我的基本假设是 cppwinrt.exe 工具将 C++ 17 语法绑定到 ABI,我不知道它如何绑定 C++ 20 或未来更新版本的语法)

同样,来自 C#/WinRT 投影的 cswinrt.exe 工具从 .winmd 文件生成 .cs 文件。同样的问题也适用,cswinrt.exe 工具如何知道要使用哪个“C# 版本”来生成 .cs 文件?

我也没有在 cswinrt.exe 工具中看到任何用于指定“C# 版本”的开关!

最终目标:了解“语言版本”如何适应 WinRT 语言预测

cppwinrt.exe tool doesn't allow you to specify a C++ language standard. It simply defaults to C++17, with the ability to opt-in to newer language features by way of feature test 宏。

结果是生成的头文件可以用任何C++17编译器编译,或者支持更高语言版本的编译器。

此时(C++/WinRT 版本 2.0.210922.5)使用了四个 C++20 功能:

  • C++20 协程,由 #ifdef __cpp_lib_coroutine 指令保护(尽管这实际上只是决定是否包含 coroutine 头文件=]experimental/ 目录;自 VS 2015 起支持协同程序。
  • C++20 个模块。这不受保护,因为客户需要通过 import 声明显式 opt-in 来使用 winrt.ixx
  • 支持 C++20 范围(在 2.0.210329.4). This is an interesting one in that none of the code changes require a C++20 compiler. The feature simply lights up for clients using a C++20 compiler when they use the <ranges> 标准库头中引入。
  • C++20 std::format(在 2.0.210922.5 中引入),由 #ifdef __cpp_lib_format 指令保护。

从根本上讲,C++/WinRT 只是一个 C++ 库。因此,它可以采用任何适合提供 language-adaptive 实现的技术。

我不知道 C#/WinRT 的内部运作方式,也不知道 C# 是如何运作的,所以我无法对此发表评论。