Задать вопрос
@calculator212

Какая разница на практике между clang и gcc?

Из того что я читал, разница между clang и gcc в том, что clang может отлавливать больше больше потенциальных ошибок, но реально я пользовался только gcc. Статьи которые я видел по этой теме в целом говорят о том, что у clang больше преимуществ, но как с этим обстоят дела на практике? И из статей я так понял, что полной совместимости между компиляторами нет, хотелось бы узнать большая ли вероятность того что проект не получится скомпилировать clang если изначльно он писался под gcc?
  • Вопрос задан
  • 10467 просмотров
Подписаться 3 Простой 3 комментария
Решения вопроса 2
@MarkusD Куратор тега C++
все время мелю чепуху :)
Однажды я на подобный вопрос уже отвечал, правда там вопрос был о кроссплатформенности, а не о трансляторах.

Какая разница между clang и GCC.
Разница большая. GCC обладает обширной поддержкой наследия идиом и конструкций из языка C, которые, вынужденно или по своей воле, поддерживает в современном C++.
VLA, тип по умолчанию, всевозможные изыски синтаксиса C. Это все GCC не глядя принимает за C++ код и позволяет трансляцию.
GCC даже сегодня многократно нарушает стандарты C++ просто потому что выбрал стратегию поддержки экзотической функциональности C в коде C++. Так же GCC не хвастается и скоростью поддержки стандартов C++.
В 2016 году Google полностью отказались от поддержки GCC в Android NDK из-за слишком плохой поддержки стандартов и слишком свободного следования стандартам C++. В этот момент GCC стал неконкурентоспособным относительно оставшихся двух самых широко используемых трансляторов.
Clang же, наоборот, сегодня считается, буквально, бастионом идеального следования стандартам C++. Clang точно поддерживает стандарты во всех деталях, максимально быстро интегрирует изменения и добавления стандартов, позволяет в самых первых рядах поиграться с функциональностью из драфтов следующего стандарта C++.
Clang обладает обширной системой статической и динамической проверки кода: богатый статический анализ, возможность подключения санитайзеров, поддержка C++ Core Guidelines, очень качественные отчеты об ошибках трансляции, хорошая скорость трансляции.
Это все ставит clang в предпочтение перед GCC на третьих для GCC платформах.

О полной совместимости между трансляторами.
Полная совместимость между трансляторами есть. Иначе я бы не мог делать то, что я делаю. А дело мое заключается в создании полностью кроссплатформенного кода, который однозначно собирается на всех целевых платформах и на всех них выполняется так же однозначно.
Полная совместимость между трансляторами заключается в строгом соответствии кода выбранному стандарту C++. Всё, точка. На этом к трансляторам требования заканчиваются.
Только тут есть небольшая проблема. Каждый транслятор по-своему поддерживает стандарт и по-своему реализует неоговоренные стандартом механики. Каждый транслятор имеет свои ошибки трансляции. И вскрывается это все именно в процессе работы над кроссплатформенным кодом.

Я в своей работе видел многое. Я видел как при смене GCC на clang люди хватались за голову и отказывались от последнего просто потому что он нашел горы нарушений стандарта, которые молча принимал GCC. Я видел как группа из 5 человек 3 месяца рефакторила код при переходе с MSVS2015 на MSVS2017 (т.е. просто при смене версии транслятора) просто потому что разработчики из рук вон плохо знают используемый ими стандарт C++.
Я видел ошибки в clang, приводящие к неверной генерации кода. Я видел ошибки в GCC, не позволяющие использовать его для кроссплатформенной сборки. Я видел ошибки в MSCL, в результате которых последний явно нарушает стандарт, а команда его разработки отказывается это исправлять потому что "иди нафиг".

И, тем не менее, конкретно у меня есть возможность писать код ровно один раз и собирать его на 5 совершенно разных целевых платформ совершенно разными трансляторами, на которых этот код работает абсолютно равнозначно. Просто потому что я знаю стандарт и то, как этот стандарт поддерживают выбранные мной трансляторы.
Ответ написан
@Voland69
Clang действительно строже, и вероятность не собрать то что успешно работало под gcc действительно есть.
Грубо говоря то что gcc пропустил в clang станет warning'ом, а то что в gcc было warning'ом в clang стало ошибкой компиляции.
Поведение можно настроить флагами компиляции.
Полной совместимости действительно нет, и в контексте плюсов MSVC, GCC, Clang и MinGW это четыре разных компилятора.
А Вы собственно какую задачу решаете?
Если вопрос на чем писать и дебажить - на том компиляторе, которым планируете артефакты собирать. Если таковых много, то вариант один - дебажить на самом популярном/строгом и периодически проверять сборку под остальные платформы.
Ну и по максимуму обмазать тестами - то что код собрался это еще полдела, надо чтобы он еще предсказуемо и правильно работал.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы