Pregunta sobre archivo de cabecera

Iniciado por Zodiak98, 10 Mayo 2013, 01:03 AM

0 Miembros y 2 Visitantes están viendo este tema.

Zodiak98

Hola bueno, es qué tengo una duda sobre este tema, mi profesor no explica muy bien que digamos. >__< Y acá me ayudan todo el tiempo xD

Ok bueno, mi duda es la siguiente:

Un archivo de cabecera contiene las declaraciones de un archivo de código fuente. Entonces el archivo de código fuente es el que le da el cuerpo a esas declaraciones. Pero entonces al ir al main se añade la cabecera y no el código fuente que le da cuerpo a las funciones de esa cabecera.

Alguien que me explique claramente esto. :)

Porqué yo por mi parte pienso que seria bueno añadir el código fuente que le da el cuerpo a esas declaraciones de la cabecera, ya qué bueno es la que tiene el cuerpo de las declaraciones. >__< Pero claro estoy para aprender.

Y sí también se que se puede añadir el archivo de código fuente pero ese no es el caso. :)

pacoperico

Cuando en un programa incluimos un archivo de cabecera mediante la directiva  #include y luego lo compilamos, el preprocesador de C lo que hace realmente es copiar las lineas de codigo del archivo de cabecera e insertarlo en nuestro codigo fuente. Cuando en el "main" añades la cabecera, lo que estas haciendo es copiar literalmente el contenido de esa cabecera en tu "main". Y por lo tanto, podras usar las funciones que hubiesen en el archivo de cabecera sin necesidad de prototiparlas y definirlas porque ya estan prototipadas y definidas. Con "main" me refiero al archivo de codigo fuente donde se encuentra la funcion main().

Dicho de otro modo mas sencillo. Si por ejemplo, en un archivo de cabecera escribes una funcion y luego añades ese archivo de cabecera a tu programa es como si la hubieras escrito directamente en tu programa.

Creo que es posible que a lo que se puede estar refiriendo tu profesor es a separar la interfaz de la implementacion es decir, separar los prototipos de funciones de sus definiciones. Un ejemplo de lo que te quiero decir, imagina que tenemos lo siguiente:

- Un archivo de cabecera el cual, solo contiene los prototipos de las funciones. Este archivo seria la interfaz.
- Un archivo de codigo fuente que solo contiene las definiciones de las funciones. Este seria la implementacion.
- Y otro archivo de codigo fuente en el que se encuentra nuestra funcion main().

Este ultimo archivo de codigo fuente seria nuestro programa, y en el que con solo añadir el archivo de cabecera ya podremos usar perfectamente todas las funciones que haya dentro del aychivo de cabecera.

Zodiak98

Cita de: pacoperico en 10 Mayo 2013, 02:36 AM

- Un archivo de cabecera el cual, solo contiene los prototipos de las funciones. Este archivo seria la interfaz.
- Un archivo de codigo fuente que solo contiene las definiciones de las funciones. Este seria la implementacion.
- Y otro archivo de codigo fuente en el que se encuentra nuestra funcion main().



Exacto a esa última parte me refiero, pero entonces si incluimos la cabecera, y la cabecera tiene de forma separada la definicion en otro archivo de código fuente (Qué no es el main), el le da el cuerpo a esas funciones de la cabecera y luego con añadir la cabecera basta? Porqué ya el otro archivo de código fuente le dio el cuerpo no?. Espero haberme explicado.

0xDani

El caso es que al final tienes que incluir la implementación, no sólo los prototipos, para esto tienes varias opciones:

- Crear una librería estática o dinámica, y linkear con ella.
- Compilar tanto la implementación como el código del main a código objeto, y enlazarlos para crear un ejecutable.
- Compilar la implementación y el main juntos directamente.

La primera opción es la ideal, pero depende más del compilador y la plataforma.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

pacoperico

Cita de: Zodiak98 en 10 Mayo 2013, 03:46 AM
Exacto a esa última parte me refiero, pero entonces si incluimos la cabecera, y la cabecera tiene de forma separada la definicion en otro archivo de código fuente (Qué no es el main), el le da el cuerpo a esas funciones de la cabecera y luego con añadir la cabecera basta? Porqué ya el otro archivo de código fuente le dio el cuerpo no?. Espero haberme explicado.

Si la definicion se encuentra en un archivo distinto de codigo fuente, en el propio archivo de cabecera podriamos incluir ese archivo de codigo fuente. Incluso tambien se podria incluir ese archivo de codigo fuente, desde nuestro archivo donde se aloja la funcion main(). Asi solo tendriamos que compilar al archivo donde se encuentra el main para poder tener nuestro programa listo.

Me he expresado mal cuando en mi anterior post te dije de incluir solo la cabecera, a lo que me queria referir es a incluir tanto la cabecera como su definicion. Y para ello hay varias formas de hacerlo como bien te ha señalado 0xDani. Yo la opcion que mas me gusta es compilar por una parte el archivo de definicion a codigo objeto, luego desde el archivo donde tenemos el main incluimos el archivo de cabecera en el cual solo estan los prototipos para luego finalmente compilar el archivo del main enlazando con el codigo objeto del archivo de definicion.