Я не вижу переключателя для указания «версии C++» в инструменте cppwinrt.exe!
(мое основное предположение заключается в том, что инструмент cppwinrt.exe связывает синтаксис C++ 17 с ABI, я не могу понять, как он может связывать синтаксис C++ 20 или будущих более новых версий)
Аналогичным образом средство cswinrt.exe из проекции C#/WinRT создает файлы .cs из файлов .winmd. Тот же вопрос применим: как инструмент cswinrt.exe узнает, какую «версию C#» использовать для создания файлов .cs?
Я также не вижу переключателя для указания «версии C#» в инструменте cswinrt.exe!
конечная цель: понять, как «языковые версии» вписываются в языковые проекции WinRT.
Инструмент cppwinrt.exe не позволяет указать стандарт языка C++. По умолчанию он просто C++17 с возможностью подписки на более новые функции языка с помощью макросов функциональный тест.
В результате сгенерированные файлы заголовков можно скомпилировать с помощью любого компилятора C++17 или компилятора, поддерживающего более позднюю языковую версию.
В настоящее время (C++/WinRT версии 2.0.210922.5) используются четыре функции C++20:
#ifdef __cpp_lib_coroutine
(хотя на самом деле это всего лишь решение о том, включать ли заголовочный файл сопрограмма из каталога экспериментальный / или нет; сопрограммы поддерживаются с VS 2015).import
.std::format
(представлен в 2.0.210922.5), охраняемый директивой #ifdef __cpp_lib_format
.На фундаментальном уровне C++/WinRT — это просто библиотека C++. Таким образом, он может использовать любую технику, подходящую для обеспечения реализации, адаптированной к языку.
Я не знаю, как C#/WinRT работает внутри, как и C#, если на то пошло, поэтому я не могу комментировать это.
@TheUniverse Как сказал IInspectable, C++/WinRT поддерживает C++17 и выше, а созданные файлы заголовков будут использовать преимущества выбранных функций C++20, если они обнаружат, что они используются компилятором C++20. Поскольку C++20 в значительной степени обратно совместим с C++17, заголовки не нуждаются в отдельных версиях C++17 и C++20. Они могут просто выборочно «подсвечивать» возможности C++20.
@РаймондЧен. Так понятней. Я получаю это сейчас. Спасибо
Что касается C#, C# имеет то преимущество, что функции BCL отделены от языковой версии. Таким образом, CsWinRT не нужно ориентироваться на более новую языковую версию, чтобы использовать новые функции BCL. Более новые языковые версии в конечном итоге содержат больше синтаксического сахара.
@cha Я переработал предложенное вами редактирование. Пожалуйста, посмотрите, верна ли информация.
Да, мне кажется, это хорошо @IInspectable
Итак, cppwinrt.exe v2 всегда основан на С++ 17, несмотря ни на что, верно? относится ли то же самое к C#/WinRT, где cswinrt.exe v1.x основан на синтаксисе .NET 5 C#, несмотря ни на что, верно? Кстати, я только что видел, как Кенни Керр выпустил C++/WinRT v3, ориентируясь на C++23 как на минимальную версию. github.com/microsoft/cppwinrt/issues/1123