
Модули C++20 — как я с ними намучился
Sivchenko_translate 9 минут назад Модули C++20 — как я с ними намучился 10 мин 194 Программирование * C++ * Компиляторы * Перевод Автор оригинала: Frederic Schönberger В стандарте C++20 было представлено множество...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. Sivchenko_translate 9 минут назад Модули C++20 — как я с ними намучился 10 мин 194 Программирование * C++ * Компиляторы * Перевод Автор оригинала: Frederic Schönberger В стандарте C++20 было представлено множество нововведений, и одним из наиболее крупных и долгожданных в их числе являлись модули. Теперь, когда с тех пор минуло около шести лет, то воодушевление сменилось здоровым цинизмом. Так, авторы сайта Are We Modules Yet прогнозируют, что поддержка модулей во всех библиотеках будет обеспечена к 1 мая 2167 года, а на Reddit не проходит и двух недель, как возникает очередной тред на тему: «Ну что, ими уже можно пользоваться»?
Моя собственная одиссея по работе с модулями началась с того, как я в очередной раз взялся переписывать мою воксельную игру. Насколько же слабо я представлял, во что ввязываюсь. Первым делом я попробовал Visual StudioЯ приступил к работе, вооружившись Visual Studio 2022, и на первых порах всё было нормально.
Технические детали
Судьба уберегла меня от Intelli(Non)Sense, поскольку я всегда пользовался ReSharper++, который «просто работает» с модулями. Однако, был и нерабочий элемент: MSVC. Всякий раз при повышении версии Visual Studio в ней что-то ломается, и требуется изыскивать способы вновь умилостивить компилятор.
Тем хуже, что даже те баги, о которых сообщают, устраняются редко, а на то, чтобы поднять правку в главную ветку разработки (и она там закрепилась), требуются годы (sic! Разумеется, не во всём этом вина компилятора. Определённо бывало и так, что я сам что-то неверно понимал.
Рассмотрим, к примеру, следующий код:export module foo:bar; // блок интерфейса раздела модуля // ... module foo:bar; // блок реализации раздела модуля // ... Разделы модулей и разделы реализации модулей могут фигурировать под разными именами.
Отраслевые последствия
Мне представляется, что с давних пор блоки интерфейсов модулей и блоки реализации явно соотносились примерно, как парные файлы «заголовочный файл/файл с исходным кодом». Поэтому представьте, как я удивился, когда ReSharper вдруг стал показывать мне ошибки. А компилятор это воспринял нормально: оказывается, в MSVC есть расширение, которое бесшумно это разрешает.
В теории import std; также казался отличной идеей, но на практике он постоянно отказывает даже в случае со следующей простейшей программой:module; #include module foo; import std;На большинстве версий MSVC она просто отказывала — это было в порядке вещей. Со временем ситуация улучшилась, и к концу 2024 года я, наконец, смог преобразовать всю мою базу кода к виду import std;. Кроме того, я научился договариваться с компилятором и интуитивно стал неплохо распознавать те вещи, которых стоило избегать, чтобы его не злить.
Тем временем успели выйти новые фичи C++: дедуктивный вывод this и многоиндексный operator с std::mdspan. Это работало с нормальным C++, но не с модулями (MSVC выдаёт услужливое: «Сожалею, для модулей пока не реализовано! »), что меня слегка раздражало.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




