Я учусь в колледже, и для проекта, в котором мы используем C. Мы изучили GCC и Clang, и Clang выглядит гораздо более удобным для пользователя, чем GCC. В результате мне интересно, каковы преимущества или недостатки использования clang, в отличие от GCC, для разработки на C и C ++ в Linux?
В моем случае это будет использоваться для программ уровня студента, а не производства.
Если я использую Clang, должен ли я отлаживать с помощью GDB и использовать GNU Make, или использовать другой отладчик и утилиту make?
<atomic>
не поддерживается, возможно, отсутствуют некоторые другие мелочи ... Я не могу его использовать, поэтому я не совсем в курсе этого).Ответы:
РЕДАКТИРОВАТЬ:
Ребята из gcc действительно улучшили опыт диагностики в gcc (ну соревнования). Они создали страницу вики, чтобы продемонстрировать это здесь . У gcc 4.8 теперь неплохая диагностика (в gcc 4.9x добавлена поддержка цвета). Clang по-прежнему лидирует, но разрыв сокращается.
Оригинал:
Для студентов я безоговорочно рекомендую Clang.
Производительность с точки зрения сгенерированного кода между gcc и Clang теперь неясна (хотя я думаю, что gcc 4.7 все еще лидирует, я еще не видел убедительных тестов), но для студентов, изучающих его, в любом случае это не имеет значения.
С другой стороны, предельно ясная диагностика Кланга, безусловно, легче интерпретировать новичкам.
Рассмотрим этот простой фрагмент:
Вы сразу заметите, что точка с запятой отсутствует после определения
Student
класса, верно :)?Что ж, gcc тоже это замечает по моде:
И Кленг тоже не играет здесь главную роль, но все же:
Я целенаправленно выбираю пример, который вызывает неясное сообщение об ошибке (возникающее из-за двусмысленности в грамматике), а не типичные примеры «Боже мой, Кланг, читай мои мысли». Тем не менее, мы замечаем, что Clang избегает потока ошибок. Не нужно пугать учеников.
источник
На данный момент GCC имеет гораздо лучшую и более полную поддержку функций C ++ 11, чем Clang. Кроме того, генератор кода для GCC выполняет лучшую оптимизацию, чем в Clang (по моему опыту, я не видел исчерпывающих тестов).
С другой стороны, Clang часто компилирует код быстрее, чем GCC, и выдает лучшие сообщения об ошибках, когда с вашим кодом что-то не так.
Выбор того, какой из них использовать, действительно зависит от того, что для вас важно. Я ценю поддержку C ++ 11 и качество генерации кода больше, чем удобство компиляции. Из-за этого я использую GCC. Для вас компромиссы могут быть разными.
источник
Я использую оба, потому что иногда они дают разные, полезные сообщения об ошибках.
Проект Python смог найти и исправить несколько небольших ошибок, когда один из разработчиков ядра впервые попытался скомпилировать с помощью clang.
источник
Я использую и Clang, и GCC, и обнаружил, что у Clang есть несколько полезных предупреждений, но для моих собственных тестов трассировки лучей - он на 5-15% медленнее, чем GCC (конечно, с долей соли, но пытался использовать похожие флаги оптимизации для обоих).
Поэтому сейчас я использую статический анализ Clang и его предупреждения со сложными макросами: (хотя теперь предупреждения GCC в значительной степени хороши - gcc4.8 - 4.9).
Некоторые соображения:
Clangs(например, QtCreator*****). РЕДАКТИРОВАТЬ: QtCreator теперь поддерживает вывод Clang***** - эти направления активно развиваются и в ближайшее время могут быть поддержаны
источник
Для программ уровня студентов Clang имеет то преимущество, что по умолчанию он более строгий. стандарт С Например, следующая версия Hello & World от K & R принята без предупреждения GCC, но отклонена Clang с некоторыми довольно описательными сообщениями об ошибках:
С GCC вы должны дать ему
-Werror
понять, что он не является действительной программой C89. Кроме того, вам все еще нужно использоватьc99
илиgcc -std=c99
получить язык C99.источник
gcc
как правило, должен вызываться, по крайней мере-Wall
, который предупреждает для этой программы.clang
действительно производит хорошие предупреждения / ошибки, все же.gnu99
, иgnu++98
иgnu++0x
. Я думаю, что это подлинные расширения , то есть они будут компилировать соответствующий код стандарта ISO без проблем. Вот подробности: для C , для C ++ .Я думаю, что лязг может быть альтернативой.
GCC и clang имеют некоторые различия в выражениях, например
a+++++a
, и у меня много разных ответов с моим коллегой, который использует clang на Mac, а я использую gcc.GCC стал стандартом, и Clang может быть альтернативой. Потому что GCC очень стабилен, а лязг все еще развивается.
источник
a+++++a
должен произойти сбой, так как он анализируется какa ++ ++ + a
синтаксическая ошибка.