🔥 Опасная ловушка в C++ модулях
Работаете с модулями в C++20/23? Осторожно: один символ может превратить ваш код в некорректный, но компилятор может об этом промолчать.
Представьте: вы создаёте
В чём подвох? При использовании
GCC 15 честно выдаст ошибку: «redeclaring in global module conflicts with import». А вот MSVC спокойно пропустит такой код, оставляя вас с программой, которая работает, но формально нарушает стандарт. Это классический пример того, как тонкости модулей могут стать источником неочевидных багов при переносе кода между компиляторами.
Сталкивались ли вы с неожиданным поведением модулей? Какие компиляторы используете для работы с C++20/23?
👉 Заметка
Библиотека C/C++ разработчика
#буст
Работаете с модулями в C++20/23? Осторожно: один символ может превратить ваш код в некорректный, но компилятор может об этом промолчать.
Представьте: вы создаёте
module unit для модуля A и случайно пишете import A; вместо module A;. Казалось бы, очевидная ошибка. Но если вы используете MSVC — код скомпилируется, слинкуется и запустится без единого предупреждения.В чём подвох? При использовании
module A; ваша реализация функции корректно прикрепляется к модулю A. Но когда вы пишете import A;, функция попадает в глобальный модуль, который содержит все имена, не привязанные к конкретным модулям. Технически это конфликт: функция уже экспортирована из модуля A, а вы пытаетесь определить её заново в глобальном пространстве.GCC 15 честно выдаст ошибку: «redeclaring in global module conflicts with import». А вот MSVC спокойно пропустит такой код, оставляя вас с программой, которая работает, но формально нарушает стандарт. Это классический пример того, как тонкости модулей могут стать источником неочевидных багов при переносе кода между компиляторами.
Сталкивались ли вы с неожиданным поведением модулей? Какие компиляторы используете для работы с C++20/23?
👉 Заметка
Библиотека C/C++ разработчика
#буст
👍3❤1😢1