Hoy en día, clang está reemplazando a gcc en la mayoría de los places. es decir, la mayoría del * sistema operativo tipo NIX y las distribuciones de Linux. Algunos ejemplos son FreeBSD, Minix y Mac (un poco obvio) clang que cambió clang como compilador por defecto. Algunos de mis amigos también, cuando los mostré.
Este en mi humilde opinión, parece que algunas personas tuvieron problemas con él, probablemente en versiones anteriores. Pero con la versión 3.0 de clang, no tengo ninguno de estos problemas. Como mencioné antes, lo estoy usando realmente en todos mis nuevos proyectos. Casi mi compilador predeterminado, a veces hago make C=gcc
para ver cómo la diferencia de clang error/advertencia. Y ganar clang alguna vez. Con mejores explicaciones y hacer un gran esfuerzo para la optimización. Incluye sugerencias para extensiones de uso (algunas son gcc inerhid) del compilador a un mejor rendimiento en la generación de código.
Escribí una función trivial que imprime un mensaje de error. Pero me gustaría salir del programa después de haber impreso el mensaje de error en la salida estándar.Entonces, hago una modificación simple, pongo un exit(1)
como última declaración en la función. Como el siguiente:
void error(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(1);
}
Y lo que el espectáculo sonido metálico
advertencia: la función 'error' podría ser declarado con el atributo 'NoReturn' [-Wmissing-NoReturn] `
(gcc no lo produce ni siquiera con -Wall -Wextra -Wunreachable-code -O3
flags)
Digo "eso parece agradable. Pero, ¿qué es el atributo 'nonreturn'? Nunca escucho o leo sobre esto. Salto a google y busco clang could be declared with attribute 'noreturn'
(ah, sí, podría escribir clang nonreturn attribute
, pero lo olvido) y encontré this
enlace con una buena explicación de lo que es este atributo y la posible ganancia de rendimiento que pude obtener.
Así que corro para agregar este atributo a mi prototipo de función (por supuesto, si es el compilador gcc o clang; las macros harán la detección de truco). Oh, sí, para mí, cualquier pequeña ganancia de rendimiento (por supuesto, sin hacer que el código sea ilegible) es una victoria.
Y no termina aquí, hace un año, hago return
en una función donde, evidentemente, es un interruptor como el manejo predeterminado definido (como en la función error()
aquí). Pero aun así, gcc clains acerca de la función sin valor de retorno (lo siento, no recuerdo exactamente el mensaje de error/advertencia) ¿cómo es posible? no hay más declaraciones después del cambio, si no hay coincidencia de caso, se ejecuta el valor predeterminado y realmente no importa las declaraciones a continuación, si las hay. Pero creo que es diferente, como yo, y dar una advertencia sobre esta declaración, ayudándome a crear un mejor código.
Y para este tipo de cosas muy pequeñas, me encanta el clang. (Nota: lo siento por mi inglés malo. El inglés no es mi idioma materno, pero a pesar de eso estoy tratando de expresarme aquí)
Es mejor que espere a XCode4 y verá el uso del clang. cohete. – ismail
Una nota: CLang es la producción madura para C, sin embargo, el soporte de C++ sigue siendo un progreso continuo, C++ 03 normalmente es bueno, pero C++ 0x se está quedando atrás de wrt VC++ y gcc. Sin embargo, se está desarrollando activamente. –
Solía programar C en GCC, porque, bueno, este * es * el compilador, creo que tengo que mirar un poco fuera de la caja, me gusta mucho la expresividad de las quejas del compilador, +1 por la introducción de este compilador. –