No hay nada mágico acerca de la compilación. ¡Ni automático!
Los archivos de encabezado básicamente proporcionan información al compilador, casi nunca código.
Esa información sola, por lo general, no es suficiente para crear un programa completo.
considerar el programa "hola mundo" (con la simple función puts
):
#include <stdio.h>
int main(void) {
puts("Hello, World!");
return 0;
}
sin la cabecera, el compilador no sabe cómo tratar con puts()
(no es una palabra clave C). El encabezado le permite al compilador saber cómo administrar los argumentos y devolver el valor.
Cómo funciona la función, sin embargo, no se especifica en ningún lugar de este código simple. Alguien más ha escrito el código para puts()
e incluido el código compilado en una biblioteca. El código en esa biblioteca se incluye con el código compilado para su fuente como parte del proceso de compilación.
Ahora consideran que quería su propia versión de puts()
int main(void) {
myputs("Hello, World!");
return 0;
}
Compilación simplemente este código da un error porque el compilador no tiene información acerca de la función. Puede proporcionar esa información
int myputs(const char *line);
int main(void) {
myputs("Hello, World!");
return 0;
}
y el código ahora compila --- pero no se vincula, es decir, no produce un ejecutable, porque no hay ningún código para myputs()
. Por lo que escribir el código para myputs()
en un archivo llamado "myputs.c"
#include <stdio.h>
int myputs(const char *line) {
while (*line) putchar(*line++);
return 0;
}
y hay que recordar que compilar tanto su primer archivo de origen y "myputs.c" juntos.
Después de un tiempo, su archivo "myputs.c" se ha expandido a una mano llena de funciones y necesita incluir la información sobre todas las funciones (sus prototipos) en los archivos fuente que desean usarlas.
Es más conveniente escribir todos los prototipos en un solo archivo y #include
ese archivo. Con la inclusión no corre riesgo de cometer un error al escribir el prototipo.
Sin embargo, todavía tiene que compilar y vincular todos los archivos de código.
Cuando crecen aún más, se pone todo el código ya compilado en una biblioteca ... y eso es otra historia :)
Sí, esto va a compilar (y por qué pensar que es un "desastre "?). Los conceptos para aprender son ** unidades de compilación ** y ** vinculación **. – Jesper
Gracias ** Jesper **; Jaja, no es un desastre, supongo que esa palabra es mejor reservada para describir mi cerebro, leyendo entre 3 libros de "C" de nivel para principiantes. Ciertamente examinaré * unidades de compilación * y * vinculación *, sin embargo, para enfocarme en la sintaxis de aprendizaje, dejaré que ** NetBeans ** + ** gcc ** resuelva esto por mí.Dado que, cada vez que un archivo de encabezado dado tiene declaraciones para las cuales existen definiciones en otras partes del proyecto, la inclusión de ese archivo de encabezado es suficiente para proporcionar acceso a la funcionalidad definida, y el compilador clasificará los detalles. – Dan
'header.h' necesita incluir guardias;) – alternative