El compilador es el programa que, dado un conjunto de ficheros de código, los traduce y genera un fichero listo para ejecutar. Pero para que esta traducción sea posible, el programa debe cumplir con los requisitos que impone el lenguaje de programación. El tipo de comprobaciones que se hacen en esta traducción depende tanto del lenguaje de programación como del propio compilador. Cuando se detecta en el programa algo que no está permitido por las normas del lenguaje, el compilador muestra un mensaje y se detiene la traducción.
Estos mensajes no explican en detalle la causa por la que aparecen, sino la anomalía puntual que ha detectado el compilador. Por este motivo, puede ser difícil identificar la verdadera razón detrás de un error mostrado por el compilador.
El lenguaje de programación C está definido de tal forma que hay numerosas decisiones que el compilador adopta de forma automática ante la ausencia de información. En otras palabras, el compilador toma decisiones sobre cómo traducir el código que el programador no ha escrito en el código. Esto, en ciertas situaciones, es cómodo, pues hace que los programas puedan ser escritos más rápido, pero sólo programadores con experiencia suelen aprovechar esta característica. Lo más recomendable es utilizar una opción en el compilador para que notifique aquellos casos en los que está tomando decisiones implícitas. En el compilador gcc esta opción es -Wall.
El compilador muestra dos tipos de anomalías: errores y advertencias. Un error es una condición que impide la obtención del programa final. Hasta que no se solventen todos los errores, el compilador no puede terminar su trabajo. Los primeros errores que se muestran son los más fiables porque se intenta traducir todo el programa hasta el final, con lo que es posible que haya errores que se deriven de otro anterior. Por tanto, si se arreglan los primeros errores, es recomendable compilar de nuevo para ver si como consecuencia han desaparecido también otros errores posteriores.
Las advertencias son mensajes que muestra el compilador sobre situaciones “especiales” en las que se ha detectado una anomalía pero que, asumiendo ciertas condiciones, la traducción del programa continúa. Por tanto, la compilación de un programa no termina mientras tenga errores pero, sin embargo, se puede obtener un programa traducido aunque el compilador muestre advertencias. Cuando se comienza a programar en C y hasta que no se tenga un nivel de experiencia elevado en la codificación de aplicaciones complejas (numerosos ficheros de código) la recomendación es:
Compilar siempre con la opción -Wall y no considerar el programa correcto hasta que no se hayan eliminado todas las advertencias.
[Gough05] An Introduction to GCC. Network Theory Ltd. Copyright © 1995 Network Theory Ltd. Capítulo 13. Common Error Messages .