C/Visual C - archivos de cabecera

 
Vista:

archivos de cabecera

Publicado por Nasón (40 intervenciones) el 03/03/2004 23:49:30
Veo en muchos programas que entre el código se incluye un archivo *.h en el que se declaran los prototipos de las funciones a utilizar en la aplicación y que la definición de éstas se hace en un fichero *.c aparte. Mi pregunta es:
¿No podemos hacer las definiciones en este archivo directamente? Estoy haciendo un archivo *.h (en C) en el que defino unas funciones para manipular matrices que usaré en muchos programas. La estructura es la siguiente:
#if !defined(_MATRICES_H) //si el fichero no está definido
#define _MATRICES_H 1 //definirlo
#include <stdio.h> //para printf, fflush, getchar, fprintf y fputc
#include <stdlib.h> //para malloc y free
.
.
.
#endif //_MATRICES_H
¿Esta bien declarado?

muchas gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:archivos de cabecera

Publicado por El Mogur (202 intervenciones) el 04/03/2004 20:41:48
No se pueden/deben implementar las funciones en los .h porque dos ficheros distintos de implementación pueden incluirlo. Imagina que el printf estuviera _implementado_ en el stdio.h. Entonces, tu fichero MATRICES .H incluiría la implementación del printf, y otro fichero, digamos PERSONA .H donde defines el tipo de datos Persona (y que _no incluye a matrices_), también incluiría la misma implementación, y al enlazar los dos, habría conflictos de nombres repetidos (además de tardar más en compilar...).

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:archivos de cabecera

Publicado por Nasón (40 intervenciones) el 04/03/2004 21:09:08
Pero, para eso se ponen las sentencias
#if !defined(_MATRICES_H)
#define _MATRICES_H 1
.
.
#endif
¿no?, por si ya está definido, no definirlo otra vez. Me explico: dentro de matrices.h tengo la siguiente declaración: #include<stdio.h>, si, a parte de math.h incluyese en el mismo fichero stdio.h, este último no sería incluido porque la primera sentencia de stdio.h (que supongo que tenga)impide que esto ocurra por el #if !defined..., ¿no es así?
De igual forma, si en un programa digamos por equivocación o cualquier otra causa incluyese dos veces seguidas matrices.h:
#include "matrices.h"
#include "matrices.h"
la segunda no se añadiría por las sentencias de compilación condicional en cuestión.

muchas gracias por la contestación, espero seguir discutiendo sobre el tema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:archivos de cabecera

Publicado por JoseGR (41 intervenciones) el 05/03/2004 10:43:16
Hola, las principales razones para tener la declaracion en un archivo (.h) y la implementacion en otro (.c, .cpp) son:

* La implementacion es compilada 1 sola vez. Inmagina que no fuera asi y tienes un sistema grande, seria muy tedioso que cada vez que se compila esperar 20 minutos por ejemplo.

* En el .h solo se coloca los "servicios" que se ofrecen, ocultando asi en la implementacion funciones, estructuras de datos, etc, que son privados y no deben o no le interesan a las demas modulos, simplificando asi la complejidad de los sistemas.

* La idea de usar modulos no es siempre tener los archivos de implementacion, se pueden dar los .h y .lib que contiene la implementacion compilada, como lo es con openGL por ejemplo.

Espero que esto de ayude a aclarar las dudas.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:archivos de cabecera

Publicado por Nasón (40 intervenciones) el 05/03/2004 20:24:59
Muchas gracias por tu respuesta. Me gustaría que me despejases totalmente las siguientes dudas:
Si has leído los mensajes anteriores, ¿puedo utilizar las definiciones como explico en ellos?Los programas más grandes que hago tienen entre 1000 y 2000 líneas de código (a desconter líneas en blanco, comentarios, etc..) y no tengo la necesidad de pasarme largo tiempo esperando que compile.
Perdona que me ponga pesado pero querría despejar mis dudas completamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:archivos de cabecera

Publicado por chuidiang (677 intervenciones) el 08/03/2004 10:03:56
Cuando compilas, los ficheros .c se compilan de uno en uno generando los .o (o .obj). Luego estos .o se juntan para generar el .exe. Cuando empieza la compilación de un fichero .c, empieza de cero, con lo que los ifndef de otros .c ya no valen.

Si compilas A.c que incluye A.h, todo bien.
Si compilas B.c que incluye A.h, también bien, pero el ifndef no esta definido, con lo que se incluye el A.h y lo recompila.
Cuando intentes generar el ejecutable "linkando" A.o con B.o te dará error de funciones duplicadas (ambos .o incluyen el código de las funciones del .h)

Los ifndef sirven para evitar el que un unico .c (por error o por lo que sea) incluya dos veces el mismo .h. Por ejemplo, A.c puede incluir A.h y B.h. Estos dos a su vez y porque lo necesitan podrian incluir C.h. Por esto motivo A.c esta incluyendo dos veces C.h

Aunque no sea la mejor forma ni sea eficiente, puedes hacerlo como tu dices (metiendo el codigo en el .h) siempre y cuando no hayas dos ficheros .c del mismo proyecto que incluyan al .h.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar