Jestem na studiach i do projektu używamy C. Zbadaliśmy GCC i Clang, i Clang wydaje się być znacznie bardziej przyjazny dla użytkownika niż GCC. W rezultacie zastanawiam się, jakie są zalety i wady używania clang, w przeciwieństwie do GCC, do programowania w C i C ++ na Linuksie?
W moim przypadku byłoby to używane do programów na poziomie studenckim, a nie do produkcji.
Jeśli używam Clang, czy powinienem debugować za pomocą GDB i używać GNU Make, czy może użyć innego debuggera i narzędzia make?
<atomic>
nie jest obsługiwany, być może brakuje kilku innych drobiazgów ... Nie mogę go używać, więc nie jestem do końca na bieżąco z tym).Odpowiedzi:
EDYTOWAĆ:
Faceci z gcc naprawdę poprawili jakość diagnozy w gcc (konkurs ah). Stworzyli stronę wiki, aby zaprezentować ją tutaj . gcc 4.8 ma teraz całkiem dobrą diagnostykę (dodano obsługę kolorów w gcc 4.9x). Clang nadal prowadzi, ale różnica się zmniejsza.
Oryginalny:
Studentom bezwarunkowo poleciłbym Clang.
Wydajność pod względem wygenerowanego kodu między gcc i Clang jest teraz niejasna (chociaż myślę, że gcc 4.7 nadal ma przewagę, nie widziałem jeszcze rozstrzygających testów porównawczych), ale uczenie się przez uczniów i tak nie ma tak naprawdę znaczenia.
Z drugiej strony niezwykle przejrzysta diagnostyka Clanga jest zdecydowanie łatwiejsza do interpretacji dla początkujących.
Rozważ ten prosty fragment:
Od razu zauważysz, że po definicji
Student
klasy brakuje średnika , prawda :)?Cóż, gcc też to zauważa , po pewnym czasie:
Clang też nie występuje tutaj, ale nadal:
Celowo wybieram przykład, który wywołuje niejasny komunikat o błędzie (wynikający z niejasności w gramatyce), zamiast typowych przykładów „O mój Boże Clang, przeczytaj mi w myślach”. Mimo to zauważamy, że Clang unika zalewu błędów. Nie musisz odstraszać uczniów.
źródło
W tej chwili GCC ma znacznie lepsze i pełniejsze wsparcie dla funkcji C ++ 11 niż Clang. Ponadto generator kodu dla GCC zapewnia lepszą optymalizację niż ten w Clang (z mojego doświadczenia nie widziałem żadnych wyczerpujących testów).
Z drugiej strony Clang często kompiluje kod szybciej niż GCC i generuje lepsze komunikaty o błędach, gdy coś jest nie tak z kodem.
Wybór, którego użyć, naprawdę zależy od tego, jakie rzeczy są dla Ciebie ważne. Bardziej cenię obsługę języka C ++ 11 i jakość generowania kodu niż wygodę kompilacji. Z tego powodu używam GCC. Dla Ciebie kompromisy mogą być inne.
źródło
Używam obu, ponieważ czasami podają różne, przydatne komunikaty o błędach.
Projekt Python był w stanie znaleźć i naprawić wiele małych bugletów, gdy jeden z głównych programistów po raz pierwszy próbował kompilować za pomocą clang.
źródło
Używam zarówno Clang, jak i GCC, uważam, że Clang ma kilka przydatnych ostrzeżeń, ale dla moich własnych testów wzorcowych śledzenia promieni - jest konsekwentnie o 5-15% wolniejszy niż GCC (oczywiście z przymrużeniem oka, ale próbowałem użyć podobnych flag optymalizacji dla obu).
Więc na razie używam analizy statycznej Clang i jej ostrzeżeń ze złożonymi makrami: (chociaż teraz ostrzeżenia GCC są tak samo dobre - gcc4.8 - 4.9).
Kilka uwag:
Clangs(na przykład QtCreator*****). EDYCJA: QtCreator obsługuje teraz wyjście Clang***** - te obszary są aktywnie rozwijane i mogą wkrótce otrzymać wsparcie
źródło
W przypadku programów dla studentów Clang ma tę zaletę, że jest domyślnie bardziej rygorystyczny. standard C. Na przykład następująca wersja Hello World K&R jest akceptowana bez ostrzeżenia przez GCC, ale odrzucana przez Clang z kilkoma dość opisowymi komunikatami o błędach:
W przypadku GCC musisz dać to
-Werror
, aby naprawdę zwrócić uwagę na to, że nie jest to poprawny program C89. Ponadto nadal musisz używać języka C99c99
lubgcc -std=c99
go pobrać.źródło
gcc
powinno być generalnie wywoływane z co najmniej-Wall
, co ostrzega przed tym programem.clang
jednak generuje dobre ostrzeżenia / błędy.gnu99
ignu++98
ignu++0x
. Myślę, że są to oryginalne rozszerzenia , tj. Będą kompilować zgodnie ze standardem ISO bez żadnych problemów. Oto szczegóły: dla C , dla C ++ .Myślę, że clang może być alternatywą.
GCC i clang mają pewne różnice w wyrażeniach, takich jak
a+++++a
, i mam wiele różnych odpowiedzi od moich rówieśników, którzy używają clang na Macu, podczas gdy ja używam gcc.GCC stało się standardem, a clang może być alternatywą. Ponieważ GCC jest bardzo stabilny, a clang wciąż się rozwija.
źródło
a+++++a
powinien się nie powieść, ponieważ jest analizowany jakoa ++ ++ + a
błąd składniowy.