Estoy en la universidad, y para un proyecto estamos usando C. Hemos explorado GCC y Clang, y Clang parece ser mucho más fácil de usar que GCC. Como resultado, me pregunto cuáles son las ventajas o desventajas de usar clang, a diferencia de GCC, para desarrollar en C y C ++ en Linux.
En mi caso, esto se usaría para programas de nivel de estudiante, no para producción.
Si uso Clang, ¿debo depurar con GDB y usar GNU Make, o usar otro depurador y hacer la utilidad?
<atomic>
no es compatible, tal vez faltan algunas otras cosas pequeñas ... No puedo usarlo, por lo que no estoy completamente al día).Respuestas:
EDITAR:
Los chicos de gcc realmente mejoraron la experiencia de diagnóstico en gcc (ah competición). Crearon una página wiki para mostrarla aquí . gcc 4.8 ahora también tiene diagnósticos bastante buenos (soporte de color agregado gcc 4.9x). Clang todavía está a la cabeza, pero la brecha se está cerrando.
Original:
Para los estudiantes, recomendaría incondicionalmente Clang.
El rendimiento en términos de código generado entre gcc y Clang ahora no está claro (aunque creo que gcc 4.7 todavía tiene el liderazgo, aún no he visto puntos de referencia concluyentes), pero para que los estudiantes aprendan, en realidad no importa.
Por otro lado, los diagnósticos extremadamente claros de Clang son definitivamente más fáciles de interpretar para los principiantes.
Considere este fragmento simple:
Notarás de inmediato que falta el punto y coma después de la definición de la
Student
clase, ¿verdad :)?Bueno, gcc también lo nota , de una manera:
Y Clang tampoco protagoniza exactamente aquí, pero aún así:
Elegí a propósito un ejemplo que desencadena un mensaje de error poco claro (proveniente de una ambigüedad en la gramática) en lugar de los ejemplos típicos de "Oh, Dios mío, Clang leyó mi mente". Aún así, notamos que Clang evita la avalancha de errores. No hay necesidad de asustar a los estudiantes.
fuente
A partir de ahora, GCC tiene un soporte mucho mejor y más completo para las funciones de C ++ 11 que Clang. Además, el generador de código para GCC realiza una mejor optimización que el de Clang (en mi experiencia, no he visto ninguna prueba exhaustiva).
Por otro lado, Clang a menudo compila código más rápido que GCC y produce mejores mensajes de error cuando hay algo mal con su código.
La elección de cuál usar realmente depende de qué cosas son importantes para usted. Valoro el soporte de C ++ 11 y la calidad de generación de código más de lo que valoro la conveniencia de la compilación. Debido a esto, uso GCC. Para usted, las compensaciones pueden ser diferentes.
fuente
Utilizo ambos porque a veces dan mensajes de error diferentes y útiles.
El proyecto Python fue capaz de encontrar y corregir una serie de pequeños buglets cuando uno de los desarrolladores principales intentó compilar con clang.
fuente
Utilizo Clang y GCC, creo que Clang tiene algunas advertencias útiles, pero para mis propios puntos de referencia de trazado de rayos: es consistentemente un 5-15% más lento que GCC (por supuesto, tome eso con un grano de sal, pero intentó usar indicadores de optimización similares para ambos).
Entonces, por ahora, uso el análisis estático de Clang y sus advertencias con macros complejas: (aunque ahora las advertencias de GCC son bastante buenas, gcc4.8 - 4.9).
Algunas consideraciones
Clangs(QtCreator, por ejemplo,*****). EDITAR: QtCreator ahora es compatible con la salida de Clang***** - estas áreas están en desarrollo activo y pronto pueden ser compatibles
fuente
Para los programas de nivel de estudiante, Clang tiene el beneficio de que, por defecto, es más estricto. El estándar C. Por ejemplo, la siguiente versión K&R de Hello World es aceptada sin previo aviso por GCC, pero Clang la rechaza con algunos mensajes de error bastante descriptivos:
Con GCC, tiene que darlo
-Werror
para que realmente haga un punto sobre que este no es un programa C89 válido. Además, aún necesita usarc99
ugcc -std=c99
obtener el lenguaje C99.fuente
gcc
generalmente debería invocarse con al menos-Wall
, lo que advierte sobre este programa.clang
produce buenas advertencias / errores, sin embargo.gnu99
ygnu++98
ygnu++0x
. Sin embargo, creo que son extensiones genuinas , es decir, compilarán el código estándar ISO sin problemas. Aquí están los detalles: para C , para C ++ .Creo que el ruido metálico podría ser una alternativa.
GCC y clang tienen algunas diferencias en expresiones como
a+++++a
, y tengo muchas respuestas diferentes con mis compañeros que usan clang en Mac mientras uso gcc.El CCG se ha convertido en el estándar, y el sonido metálico podría ser una alternativa. Porque el CCG es muy estable y el sonido metálico aún está en desarrollo.
fuente
a+++++a
debería fallar, ya que se analiza comoa ++ ++ + a
cuál es un error de sintaxis.