Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
Текстовая трансляция CppCast 285: Инстр…

Текстовая трансляция CppCast 285: Инструмент Clang Power Tools и мифы C++

27 Авг 2021
Автор:

Эпизод 285 CppCast был записан 3 февраля 2020 года. Ведущие Роб Ирвинг и Джейсон Тернер побеседовали с Виктором Сиара о разных способах фильтрации контейнеров в C++. Обсудили пост в блоге Visual C++ от команды разработчиков Diablo 4 и расширение Clang Power Tools для Visual Studio, которое недавно стало бесплатным как для проектов с открытым исходным кодом, так и для коммерческого использования. Они также поговорили о мифах С++.

0859_CppCast_285_ru/image1.png

Этот эпизод CppCast спонсируется компанией Visual Assist. Visual Assist - широко известное расширение для Visual Studio, ускоряющее разработку с помощью интеллектуальной навигации, проверки кода и подсказок, многофункциональных команд рефакторинга и многого другого - даже проверки орфографии в комментариях. Скачайте бесплатную пробную версию на wholetomato.com.

Введение

Добро пожаловать на 285 выпуск CppCast. Сегодня у нас в гостях Виктор Сиара. Виктор – главный инженер в CAPHYON, технический руководитель команды Advanced Installer и специалист Microsoft MVP. Он постоянный гость факультета компьютерных наук Университета Крайовы, выпускником которого он является. Там Виктор читает лекции и проводит семинары по использованию C++ STL Algorithms.

С 2005 года он занимается разработкой и внедрением нескольких базовых компонентов и библиотек Advanced Installer. Сейчас большую часть своего времени он работает со своей командой над улучшением процесса перекомпоновки и расширением технологий виртуализации в Advanced Installer IDE. Он помогает клиентам переносить традиционные десктопные приложения в современный формат упаковки приложений Windows – MSIX.

Усовершенствование и модернизация устаревшей базы кода Advanced Installer является одним из его хобби и, как известно, он создает инструменты, помогающие в этом процессе. В их числе и Clang Power Tools. Добро пожаловать, Виктор.

Виктор Сиара: Привет, спасибо, что пригласили меня снова. Приятно вернуться спустя почти три года.

0859_CppCast_285_ru/image2.png

12 разных способов фильтрации контейнеров в Modern C++

Роб: Виктор, нам нужно обсудить пару новостных статей, не стесняйтесь комментировать любую из них. Затем мы поговорим о мифах C++ и о Clang Power Tools. Окей?

Виктор Сиара: Круто.

Роб: Начнем с поста в С++ Stories, и это "12 различных способов фильтрации контейнеров в Modern C++". Мне понравился этот пост, он доказывает, что код фильтрации может выглядеть проще, если использовать ranges или концепты C++ 20.

Виктор Сиара: Мне понравилась эта статья Бартека. Я читал про развитие механизма фильтрации, который там представлен и уже приближался к концу статьи, где Бартек пишет про параллельные алгоритмы, а он взял и остановился на самом интересном. И это та интересная часть, о которой он продолжит писать. Он пообещал рассказать о параллельных алгоритмах в следующем посте. Не могу дождаться!

Роб: Это пример выполнения фильтра для копирования из одного контейнера в другой с использованием параллельного алгоритма... я почти уверен, что единственное, что вы можете распараллелить, – это саму копию объекта.

Виктор Сиара: Можно распределить работу, если мы говорим здесь о фильтрации: можно выполнять фрагментами и фильтровать независимо.

Роб: Но тогда придется создавать...

Виктор Сиара: ...объединенную версию, да.

Роб: А затем объединять и их.

Виктор Сиара: Но в более функциональном стиле – через возврат копии, содержащей отфильтрованные элементы. Идея этой статьи состояла в том, чтобы использовать больше композиций в более функциональном стиле. Его задумка мне понятна.

Библиотека More_concepts

Роб: Следующее, что у нас есть, — библиотека с GitHub, и это More_concepts. Джейсон, расскажи нам о ней.

Джейсон: Это просто библиотека концептов для C++ 20. Большинство из них связаны с контейнерами: контейнерами с произвольным доступом к элементам, контейнерами определенного размера, изменяемыми контейнерами. Это может пригодиться. Мне лично нравится видеть, как люди начинают осваивать C++ 20.

Роб: Я не осознавал, что такого рода концепты на основе контейнеров отсутствовали во встроенных концептах STL.

Джейсон: В STL C++ 20 не так много концептов, верно?

Виктор Сиара: Даже в своей статье Бартек экспериментировал с концептом, в котором контейнер поддерживает push_back. Они хорошо работают друг с другом. Мое мнение относительно добавления множества дополнительных концептов для STL расходится.

Мы должны найти баланс между функциональностью, перегруженностью или созданием слишком большого количества специальных концептов, которые не могут быть использованы во многих контекстах.

Насколько я помню, Бартек был обеспокоен тем, что люди изобретают концепты налево и направо только для того, чтобы обеспечить более качественные проверки API уровня и получать более адекватные сообщения об ошибках.

Джейсон: И у меня есть проблема с компилятором, над которым мне нужно поработать. У него пока нет хорошей поддержки концептов. Я еще не могу по-настоящему применять концепты в своей реальной работе.

Виктор Сиара: И я не могу. Пока только экспериментирую.

Blizzard Diablo IV отлаживает дампы ядра Linux из Visual Studio

Роб: Последняя новость – пост из блога Microsoft Visual C++ под названием "Blizzard Diablo IV отлаживает дампы ядра Linux из Visual Studio".

Удивительно, что теперь это можно делать в Visual Studio. Если вы не привыкли погружаться в среду Linux и использовать GDB для отладки дампов ядра, так как выполняете большую часть разработки в Visual Studio, как делает это команда Blizzard, по их словам, то возможность делать это в Visual Studio значительно сэкономит время. Именно об этом и идет речь в статье.

Я хотел отметить, что в статье упоминаются параллельные стеки, и это то, что я открыл для себя только год или два назад. Любой пользователь Visual Studio, который не знает о параллельных стеках, должен пойти и заценить, что это такое. Когда вы делаете Break All или отлаживаете что-то вроде дампа ядра, вы можете просмотреть свой список потоков, текстовый список и попытаться выбрать правильный call stack, если что-то пошло не так. Но альтернативой является использование параллельных стеков, когда своего рода графически отображаются все ваши потоки и call stacks каждого из них. Плюс этого в том, что можно игнорировать более мелкие графы, потому что они просто ждут работы. Просмотрите большие графы call stack, потому что именно там, вероятнее, что-то идет не так.

Виктор Сиара: По умолчанию это очень маленькое поле со списком, только имя точки входа. Это старая функция, но менее известная.

Роб: Есть еще что-нибудь, на что следует обратить внимание в этой статье?

Виктор Сиара: Если речь зашла о менее известных, но более старых функциях Vision Studio, я как раз собирался сказать, что немногие знают о том, что в Vision Studio можно настроить работу отладчика и определять с помощью некоторых XML-файлов и предопределенной схемы. Вы можете определять размещение пользовательских объектов в памяти и то, как вы хотите, чтобы они отображались в отладчике, когда вы достигнете точки останова, а также каким образом вы хотите легко представить в Watch Window ваши внутренние механизмы сложной структуры данных или что-то типа этого. Команда Visual Studio сделала это для типов STL. И вы можете сделать то же самое для своих типов. У Бартека есть очень хороший туториал. Очень немногие люди знают об этой функции.

Роб: Я думаю, мы упоминали об этом раньше, но я добавлю ссылку в примечания.

Следующие шаги Clang Power Tools

Роб: Итак, Виктор, может начнем с новостей о Clang Power Tools, о котором вы рассказывали в прошлый раз?

0859_CppCast_285_ru/image3.png

Виктор Сиара: Еще в 2017 году я воодушевленно рассказывал CppCast о совершенно новом инструменте Clang Power Tools. Мы усердно работали над добавлением множества функций и улучшением функциональности инструмента. В 2019 году мы решили полностью посвятить себя этому продукту по причине того, что начиналось это все как "хобби", которое мы разработали для использования и применения внутри компании. Вскоре этот инструмент приобрел большую популярность в сообществе, и люди начали предлагать идеи, сообщать об ошибках, оставлять предложения, отзывы и несколько патчей. Но большую часть работы мы выполняли сами. Мы оказались жертвами собственного успеха – чрезмерно загрузили себя работой, которую предстояло выполнить. В 2019 году мы наняли штатную команду для работы над этим продуктом, и с тех пор работаем над воплощением предложенных идей, а также над запросами на реализацию новых функций и отчетами.

Мы анонсировали отдельный автономный инструмент для Clang Format Editor и Clang Format Configuration. Многим трудно разобраться с Clang Format или с набором настроек, соответствующих их кодовой базе. Недавно мы выпустили отдельное обновление, которое не привязано к Visual Studio, поэтому инструмент можно использовать автономно.

Самое большое изменение – теперь он совершенно бесплатный. Надеемся, что это подтолкнет больше людей использовать инструмент как на работе, так и в личных хобби-проектах. Они могут использовать возможности платформы LLVM и всю мощь Clang-Tidy и находить баги в кодовой базе, при этом не беспокоясь об инструментах и инфраструктуре, а только об исправлении ошибок и проблем, которые они находят в своей кодовой базе.

Роб: У вас все еще работает штатная команда?

Виктор Сиара: Да, потому что мы используем инструмент внутри компании. Мы продолжим улучшать и совершенствовать его и доделывать незавершенные задачи. Самая большая победа для нас с 2017 года по настоящее время – мы повысили уровень осведомленности в сообществе разработчиков Windows, которые не привыкли использовать такие инструменты, как Clang LLVM и Clang-Tidy. Эти инструменты получили широкое распространение среди разработчиков Windows.

Последние версии Visual Studio имеют Clang Format и хорошую поддержку Clang-Tidy. И это нельзя сравнивать с тем, что можно найти в Clang Power Tools с точки зрения возможностей настроек и того, что вы можете сделать в рабочих процессах и в автоматизации. Это повысило планку для всех пользователей Visual Studio независимо от того, используют ли они "голый" Visual Studio или инструменты Clang Power Tools. Теперь в Visual Studio, начиная с 16.7 версии, у нас есть AddressSanitizers. У нас также есть поддержка 64-разрядной системы.

Джейсон: Какими функциями Clang Power Tools отличается от Clang-Format и Clang-Tidy, которые сейчас встроены в Visual Studio?

Виктор Сиара: Рабочие процессы, простота использования и настройки. Не нужно вручную возиться с файлами конфигурации и знать все флажки наизусть. Он делает все так сказать "за кадром", а перед вами – очень простой, интуитивно понятный пользовательский интерфейс. Он также помогает в автоматизации и непрерывной интеграции.

Роб: Я хочу прервать обсуждения всего на минуту, чтобы рассказать о нашем спонсоре – инструменте Visual Assist. Visual Assist используется опытными разработчиками C++ по всему миру. Он отлично генерирует код. Вам нужно реализовать методы из интерфейса? Как насчет смены указателя на умный указатель?

Даже на умный указатель движка Unreal Engine. Добавить символ, который вы ввели, но не объявили? Visual Assist сделает это и многое другое. Плюс есть дополнительные возможности рефакторинга – более мощные, чем те, что входят в Visual C++. Или обнаружение ошибок в коде и предложение полезных исправлений. Или навигация, которая помогает вам перемещаться в коде и открывать или находить то, что вам нужно. И даже расширения для отладки.

Visual Assist написан разработчиками C++ для разработчиков C++. Он включает в себя все, что вам нужно, и ничего, что вам не нужно. Visual Assist за философию минималистичного пользовательского интерфейса. Он не захватит вашу IDE, но появится тогда, когда это будет необходимо. Он разработан для того, чтобы помогать, а не с целью рекламировать себя. Разработчики приложений, которые вы используете – будь то офисные пакеты, операционные системы или игры – полагаются на Visual Assist. Программное обеспечение, которое вы используете, было создано с помощью Visual Assist.

0859_CppCast_285_ru/image4.png

Попробуйте этот инструмент для разработки собственного продукта. Visual Assist поддерживает Unreal Engine 4 и многие версии Visual Studio, включая VS 2019 и Community. Скачайте Visual Assist на wholetomato.com.

Разрушение мифов C++ с Виктором и Джейсоном

Роб: Я знаю, что Джейсон и вы, Виктор, недавно стримили вместе. Не хотите ли вы немного рассказать нам о мифах о C++?

Виктор Сиара: Несколько недель назад у меня появилась идея, и Джейсон посчитал ее интересной. Мы с Джейсоном оффлайн обсудили несколько проблем. На проведение трансляции нас вдохновили совместные обсуждения, вопросы студентов и стажеров, споры, которые возникали во время ревью кода, а также моменты, которые не всегда понятны.

Были некоторые спорные случаи. Мы попытались разобраться во всем понемногу, мы разобрались в некоторых очевидных вещах, по крайней мере, для опытного разработчика C++. Мы много импровизировали и пытались заинтересовать аудиторию. В YouTube чате в прямом эфире мы общались с достаточно большим количеством людей, они многое предлагали. Мы пошли им навстречу и позволили обсуждению идти в любом направлении. В итоге получили хороший фидбэк.

Роб: На твоем YouTube канале есть запись трансляции, да, Джейсон?

Джейсон: Да, на моем канале есть запись.

Виктор Сиара: Мы обсудили несколько вещей: странный стандартный move-паттерн (перемещение одной и той же сущности дважды при вызове функции), uniform initialization и некоторые ее безобразные части, передачу по значению для sync аргументов. Мы также рассмотрели обработку строк вручную против стандартных регулярных выражений, стандартный optional и оборачивание разных вещей в optional, цепочки вызовов с использованием optional, монадический интерфейс для optional, проблемы производительности в коде, возникающие от использования optional. О чем мы еще говорили?

Джейсон: Может расскажете о паре наиболее распространенных мифов, о которых вы узнали от других разработчиков вашей команды? Или о тех, о которых вы не говорили.

Виктор Сиара: Я пытаюсь как-то связать воедино вещи, которые были в какой-то степени связаны с тем, что мы обсуждали. Только сегодня у нас была дискуссия о strong type wrappers во время ревью кода. Я не знаю, знакомы ли люди с данной идеей. У Джонатана Боккара была очень хорошая серия постов в блоге; у него есть библиотека под названием NamedType для обертывания объектов в strong wrappers для более безопасного вызова функций и более безопасных перегрузок. И на форуме BYOND есть библиотека strong types, обе с открытым исходным кодом.

Мы обсудили некоторые непростые ситуации, когда была выбрана неправильная перегрузка, в наборы перегрузок была добавлена новая перегрузка, а в каком-то существующем коде неправильная перегрузка была выбрана случайно и вызвала ошибку. Мы обсудили, как мы могли бы избежать этого, если бы вернулись и переделали API, подумав о различных неприятных ситуациях. Конечно, были задействованы значения аргументов функции по умолчанию. Я хочу также обсудить создание strong type wrappers для аргументов функций.

Джейсон: Я думаю, это то, что все или многие переизобретали много раз. Возможно, пора разработать стандартизированный способ создания strong typedefs. Я уже поднимал этот вопрос раньше в Твиттере. Впервые он возник примерно в 1997 году или что-то в этом роде в Комитете по стандартизации. И никто не может согласиться с тем, каким будет strong typedef. Поэтому обсуждения постоянно откладываются.

Виктор Сиара: Также есть вопрос уровня функциональности, потому что можно пойти и сделать очень сложную обертку и добавить туда кучу фич, чтобы она удовлетворяла различные потребности и подходила под различные ситуации.

Это тонкая грань между простым инструментом, который люди хотят использовать и чем-то, что вписывается во все сценарии. У дизайнеров библиотек тяжелая работа.

Джейсон: Что в итоге получилось с вашим кодом? Вы изменили API, чтобы устранить проблему?

Виктор Сиара: В нашем случае это была неудачная комбинация. И одна вещь, которая у меня уже была в списке, – это конвертирующий конструктор, который не был explicit, и некоторые перегрузки, которые имели значения по умолчанию для некоторых аргументов. Мы исправили API и избавились от проблемы, но, оглядываясь назад, если бы у нас были правильные словарные типы этих аргументов, проблем можно было бы избежать.

Роб: Поскольку мы все равно часто поднимаем эту тему, как бы вы отнеслись к тому, что, например, в следующем релизе Visual Studio или в релизе 2021 года или в каком-то еще, весь ABI "сломают", и вы должны будете все перекомпилировать, а повторно использовать существующую библиотеку будет нельзя. Это будет проблемой для вас?

Виктор Сиара: Я за "сломай все".

Джейсон: Вы полагаетесь на кучу бинарных модулей от сторонних поставщиков, которые вышли из бизнеса 15 лет назад.

Виктор Сиара: У нас очень ограниченный набор библиотек, которые мы используем в бинарном формате, но те поставщики все еще продолжают разработку. Я надеюсь, что они выпустят обновление.

Роб: Мне нравится, что ABI в последних трех версиях Visual Studio, 2015, 2017 и 2019 года, совместимы друг с другом, но я не против "сломать" ABI, и, возможно, следующие две или три версии будут совместимы друг с другом.

Виктор Сиара: Да, пришло время для "ломаного" релиза, они весьма хороши пока.

Роб: Поправьте меня, если я ошибаюсь, до 2015 года каждая версия была c критическими изменениями ABI.

Джейсон: Вот в таком мире мы жили. Мы просто никогда не предполагали, что сможем использовать библиотеки из предыдущего компилятора.

Виктор Сиара: Раньше всё было проще. Люди не строили предположений. Они программировали оборонительно, они просили исходный код.

Джейсон: С другой стороны, у вас есть Стандарты программирования на С++ от Саттера и Александреску, которые относятся к началу 2000-х годов? Где они фактически говорят: "не храните в границах вашей библиотеки типы C++...

0859_CppCast_285_ru/image5.png

Роб: И везде использовать extern "C" или...?

Джейсон: И использовать какие угодно типы, не передавайте строку через границы библиотеки. Когда я прочитал это, то подумал: "Окей, это правило, которому я следовать не буду, потому что для меня оно просто нарушило суть C++". Если у меня не может быть библиотеки, которая изначально использует строки и векторы "C", то для чего, черт возьми, я использую C++.

Виктор Сиара: Вы удивитесь, у нас куча этих интерфейсов extern "C". И у нас есть куча библиотек, которые мы используем через интерфейс "C".

Джейсон: Но на то тоже есть причины. Я не говорю, что этим совсем не надо пользоваться. Я говорю, что не хочу, чтобы у меня так было, если только для этого нет очевидной необходимости.

Виктор Сиара: По крайней мере, у тебя нет никаких забот относительно ABI.

Джейсон: Да, в этом случае относительно ABI нет никаких забот.

Виктор Сиара: "С" по-прежнему является общепринятым языком Interop. Если только вы не предпочитаете COM.

Джейсон: Я работал с объектами на C++ где-то в 2000 году. Мне нужно было предоставить иерархию объектов с наследованием через использование VB 6. Я не мог понять, как правильно COM интерфейсы должны наследоваться и как отразить это наследование в VB 6. Я спросил у VisualTeam, и они объяснили, что мне нужно было шаблонизировать унаследованный тип. Это окончательно свело меня с ума, потому что в то время я вообще ничего не понимал в C++.

Виктор Сиара: Сейчас работать с COM намного проще. Есть более простые модели активации, которые намного удобнее использовать.

Джейсон: Какие инструменты активно использует COM на данный момент?

Виктор Сиара: Все, что связано с Windows, если мы говорим о современных Windows, Win RT. Все построено на COM. Он спрятан.

Джейсон: COM — это тоже технология девяностых годов или что-то в этом роде, знаете, довольно старая.

Виктор Сиара: COM — это очень хорошо спроектированная технология. И тот факт, что он используется в современных API и в современном программном обеспечении, говорит о том, что это хорошо разработанный API, выдержавший испытание временем.

Джейсон: Теперь, когда мы зашли настолько далеко, Виктор, не могли ли бы вы описать нашим слушателям, что такое COM?

Виктор Сиара: Самое простое объяснение – COM пытается смоделировать объект, поверхность API, которая не зависит от фактической реализации. Он пытается презентовать и описать типы, их свойства и функциональность, а также он показывает, что вы можете вызывать, каковы типы и layout типов. Это средство, описывающее всю эту информацию. За всем этим стоит язык. Он называется MIDL. Можно описывать независимо от фактической реализации и независимо от аппаратного обеспечения или от того, где находится фактический код. Это абстракция, которая позволяет вам общаться с объектами, вызывать функции, проверять значения и упорядочивать информацию, хотя объект, с которым вы разговариваете, находится в том же процессе, что и вы, или во внешнем процессе, или на другом сервере. Это абстракция над API, над аппаратным обеспечением, которая позволяет гибко описывать API и методы "вызова" и обмениваться данными через границы объектов.

Джейсон: Похоже на технологию, которая была переизобретена несколько раз. Есть похожие по функционалу CORBA или MOC или интерфейсные файлы SWIG для создания различных языковых привязок.

Виктор Сиара: Мы видели различные воплощения таких инструментов, но в качестве инструмента дизайна этот имел грандиозный успех. И удивительно, что вся экосистема Windows построена на такого рода инструменте. Очень эффективная технология.

Роб: Хотим ли мы вообще вернуться к мифам о C++? Есть еще какие-нибудь мифы? Может быть, есть что-нибудь связанное с COM?

Виктор Сиара: Никаких мифов вокруг COM, это просто часть истории, верно?

Джейсон: Получили ли вы еще какой-нибудь фидбэк помимо стрима на YouTube? Например, от коллег или друзей, или что-нибудь о концепции разрушения мифов, над которой вы работаете?

Виктор Сиара: Несколько участников отметили, что им понравилась данная концепция, и они могут подумать над предложениями. Но на счет данной темы, я думаю, что некоторые люди не хотят предлагать идеи, потому что боятся, как они могут быть интерпретированы с точки зрения "это действительно миф?" или "это действительно всеобщее заблуждение?". Я боюсь, что если я представлю что-то как миф, то это может быть истолковано так, будто я с ним не согласен или наоборот согласен.

Я вижу, как людям нравится идея развенчания распространенных мифов или расследования чего-то, с чем они встречались сами. Им нравится, что они могут ссылаться на выпуски C++ Weekly и думать: "Эй, по этой теме, есть выпуск C++ Weekly, в котором говорится об этом". Приятно иметь возможность ссылаться на что-то, чтобы подкрепить чем-то обсуждения. В этом списке мифов, как мы его называем, они пытаются определить закономерности, с которыми сталкиваются, и использовать их в качестве катализатора дискуссий с коллегами или для чего-то еще.

Я вижу, что людям это нравится, но хотел бы, чтобы они были более откровенны и предлагали вещи, которые мы можем обсуждать открыто, потому что мы можем и ошибаться.

Роб: Прежде чем мы тебя отпустим, Виктор, есть ли что-нибудь еще, о чем вы хотите нам рассказать? И скажите, где и как с вами можно связаться?

Виктор Сиара: Вы можете найти меня в Твиттере по имени @ciura_victor. Я хотел бы написать краткий обзор того, о чем мы говорили, о статье Бартека, о визуализаторах Visual Studio и об отладочных визуализаторах. И я хочу, чтобы люди больше взаимодействовали с отладчиком. Печально, что некоторые не используют всю мощь визуализаторов и не добавляют туда свои собственные типы. Я был бы рад, если бы больше людей попробовали поработать с ними и, возможно, дали обратную связь команде, чтобы еще больше улучшить функциональность инструмента.

Я хочу напомнить людям о Clang Power Tools, мы бы хотели услышать больше ваших предложений. В какую сторону вы бы хотели, чтобы продвигалось совершенствование инструмента? Нравятся ли вам эвристики, которые мы реализовали в отдельном инструменте, созданным нами для Clang Power Form, Clang Format Detector и Clang Format Configuration Tool? Если у вас есть идеи, попробоуйте и посмотрите, подойдет ли инструмент вашей команде. Это устранит целый ряд дискуссий вокруг стилей и пробелов в анализах ваших кодов.

0859_CppCast_285_ru/image6.png

Я действительно призываю людей переступить через себя и свои особые потребности в задавании формата, просто договориться о формате и просто применять его как часть цепочки инструментов.

Роб: Что ж, Виктор, здорово, что вы снова побывали у нас на шоу.

Виктор Сиара: Мне понравилось. Спасибо, что пригласили.

Джейсон: Спасибо, что пришли к нам.

Большое спасибо, что послушали нашу беседу о C++. Мы хотим узнать, что вы думаете о подкасте. Пожалуйста, дайте нам знать, интересно ли вам то, что мы обсуждаем. Вы также можете предложить новые темы для обсуждения.

Отправляйте ваши отзывы на feedback@cppcast.com. Мы будем признательны, если вы поставите лайк CppCast или подпишетесь на наш Tвиттер. Вы можете подписаться на меня (@robirving) или Джейсона (@lefticus) в Twitter.

Мы также хотели бы поблагодарить всех наших спонсоров, которые поддерживают шоу через Patreon. Если вы хотите поддержать нас на Patreon, вы можете сделать это по адресу patreon.com/CppCast. И, конечно же, вы можете найти всю информацию и заметки о шоу на веб-сайте подкаста по адресу cppcast.com. Музыка для этого выпуска была предоставлена podcastthemes.com.

Ресурсы

Подкаст

Новости

Ссылки

Спонсоры

Гость

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам