Как инструмент cppwinrt.exe узнает, какую версию C++ использовать для создания заголовков из файлов .winmd?

Я не вижу переключателя для указания «версии C++» в инструменте cppwinrt.exe!

(мое основное предположение заключается в том, что инструмент cppwinrt.exe связывает синтаксис C++ 17 с ABI, я не могу понять, как он может связывать синтаксис C++ 20 или будущих более новых версий)

Аналогичным образом средство cswinrt.exe из проекции C#/WinRT создает файлы .cs из файлов .winmd. Тот же вопрос применим: как инструмент cswinrt.exe узнает, какую «версию C#» использовать для создания файлов .cs?

Я также не вижу переключателя для указания «версии C#» в инструменте cswinrt.exe!

конечная цель: понять, как «языковые версии» вписываются в языковые проекции WinRT.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Инструмент cppwinrt.exe не позволяет указать стандарт языка C++. По умолчанию он просто C++17 с возможностью подписки на более новые функции языка с помощью макросов функциональный тест.

В результате сгенерированные файлы заголовков можно скомпилировать с помощью любого компилятора C++17 или компилятора, поддерживающего более позднюю языковую версию.

В настоящее время (C++/WinRT версии 2.0.210922.5) используются четыре функции C++20:

  • Сопрограммы C++20, защищенные директивой #ifdef __cpp_lib_coroutine (хотя на самом деле это всего лишь решение о том, включать ли заголовочный файл сопрограмма из каталога экспериментальный / или нет; сопрограммы поддерживаются с VS 2015).
  • Модули С++20. Это не защищено, так как клиентам необходимо явно согласиться на использование winrt.ixx через объявление import.
  • Поддержка диапазонов C++20 (представлена ​​в 2.0.210329.4). Это интересно тем, что ни одно из изменений кода не требует компилятора C++20. Эта функция просто загорается для клиентов, использующих компилятор C++20, когда они используют заголовок стандартной библиотеки <диапазоны>.
  • C++20 std::format (представлен в 2.0.210922.5), охраняемый директивой #ifdef __cpp_lib_format.

На фундаментальном уровне C++/WinRT — это просто библиотека C++. Таким образом, он может использовать любую технику, подходящую для обеспечения реализации, адаптированной к языку.

Я не знаю, как C#/WinRT работает внутри, как и C#, если на то пошло, поэтому я не могу комментировать это.

Итак, cppwinrt.exe v2 всегда основан на С++ 17, несмотря ни на что, верно? относится ли то же самое к C#/WinRT, где cswinrt.exe v1.x основан на синтаксисе .NET 5 C#, несмотря ни на что, верно? Кстати, я только что видел, как Кенни Керр выпустил C++/WinRT v3, ориентируясь на C++23 как на минимальную версию. github.com/microsoft/cppwinrt/issues/1123

TheUniverse 22.03.2022 20:15

@TheUniverse Как сказал IInspectable, C++/WinRT поддерживает C++17 и выше, а созданные файлы заголовков будут использовать преимущества выбранных функций C++20, если они обнаружат, что они используются компилятором C++20. Поскольку C++20 в значительной степени обратно совместим с C++17, заголовки не нуждаются в отдельных версиях C++17 и C++20. Они могут просто выборочно «подсвечивать» возможности C++20.

Raymond Chen 22.03.2022 20:17

@РаймондЧен. Так понятней. Я получаю это сейчас. Спасибо

TheUniverse 22.03.2022 20:32

Что касается C#, C# имеет то преимущество, что функции BCL отделены от языковой версии. Таким образом, CsWinRT не нужно ориентироваться на более новую языковую версию, чтобы использовать новые функции BCL. Более новые языковые версии в конечном итоге содержат больше синтаксического сахара.

Charles Milette 23.03.2022 00:00

@cha Я переработал предложенное вами редактирование. Пожалуйста, посмотрите, верна ли информация.

IInspectable 23.03.2022 08:47

Да, мне кажется, это хорошо @IInspectable

Charles Milette 24.03.2022 17:08

Другие вопросы по теме