C/Visual C - Code in header?????

 
Vista:

Code in header?????

Publicado por eduardo (82 intervenciones) el 13/08/2009 17:29:45
Buenos días, he escrito una función que me permite leer un número entero positivo desde teclado, es decir no acepta caracteres que no sean dígitos, ahora a dicha función no deseo agregarla en el archivo fuente principal sinó usarla a través de un header así como se usa scanf(), gets() incluyendo el archivo stdio.h.
Lo que hice fué escribir la función en un header llamado "entrada.h" y copié dicho header en la carpeta include de la instalación del compilador para poder reutilizarla en otros programas. El programa cumple su propósito pero Borland C++ me muestra la siguiente advertencia:
entrada.h(29, 2) : Cannot create pre-compiled header: Code in header

Ubicándose el cursor en la llave de apertura de la función obtIntPos() del header.
Podrían explicarme que significa, o talvés no es la forma correcta de enlazar la función con el programa principal, podrían ayudarme por favor.

Esto es un bosquejo de lo que estoy intentando hacer:

/* Archivo 1: Programa principal */
#include <stdio.h>
#include <entrada.h>

int main()
{
int numero;

numero = obtIntPos();
....

return 0;
}

/* Archivo 2: entrada.h (este archivo va en la carpeta include de la instalación) */
int ObtIntPos( void )
{
/* codificación de la función */
}

Salu2.
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:Code in header?????

Publicado por Tom (619 intervenciones) el 17/08/2009 12:18:32
No hagas eso. En los ficheros de cabacera, si hay código es poco y en forma de macros del preprocesador (#define).

Por lo visto, tu compilador precompila las cabeceras ... eso ahorra tiempo para las siguientes compilaciones porque usará las precompiladas, pero no puede hacerlo porque hay código dentro. No es grave.
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:Code in header?????

Publicado por eduardo (82 intervenciones) el 17/08/2009 16:55:27
Gracias Tom por responder, pero entonces debo dejarlo tal cual está dado que es una advertencia nada más.
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:Code in header?????

Publicado por Tom (619 intervenciones) el 18/08/2009 11:38:43
Como tú quieras, seguramente funcionará pero no es la forma correcta de hacerlo.
Lo normal es que en un fichero .h vayan las declaraciones de las funciones y en un .c el código.
Así usarías un fichero de cabecera "entrada.h" y otro "entrada.c" con su código correspondiente.
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:Code in header?????

Publicado por eduardo (82 intervenciones) el 30/08/2009 16:31:18
Hola, gracias por responder.
Bueno averigué googleando que lo correcto sería crear un librería estática o dinámica y así lo he hecho.
Los pasos que seguí segun un tutorial para crear una librería estática son los sgtes:
- Las funciones las pasé a un archivo entrada.c con los encabezados que utiliza.
- En el header entrada.h están los prototipos y uso la directiva #define como lo explica.
- He creado el archivo objeto entrada.o haciendo
gcc -c -o entrada.o entrada.c
- Luego he creado la librería libentrada.a haciendo
ar rcs libentrada.a entrada.o
- Luego usando el programa principal (que contiene main) y el que usará la librería he creado el archivo objeto miprograma.o haciendo
gcc -c -o miprograma.o miprograma.c
- Luego pide hacer algo como:
gcc -c -o miprograma.o miprograma.c -Idir_lib
- Después se monta el programa con la librería indicando donde está y cual es su nombre:
gcc -o apli1 apli1.o -Ldir_lib -lfich

Me pierdo en éstos 2 últimos pasos y no logro enlazar correctamente. Si tengo todos los archivos en una carpeta del escritorio por ejemplo debo darle la ruta desde la consola, debo mover la librería a una carpeta del compilador o qué. No sé como hacer los 2 pasos finales aparte de esto. veo que todos los ejemplos usan la linea de comandos para compilar enlazar ejecutar lo cual me parece engorroso. Existe alguna forma de hacerlo desde el IDE Codeblocks, o sea que él se encargue de linkar lo que necesite ya que tengo creado la librería que el se encargue del resto.
Gracias por alguna respuesta.
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:Code in header?????

Publicado por Tom (619 intervenciones) el 31/08/2009 10:25:06
A veces el paso intermedio a ficheros objeto se puede obviar.

Si ya tienes creada libentrada.a (los dos primeros pasos) la puedes dejar en el directorio que te parezca bien, siempre y cuando lo especifiques luego con la opción -L.

Si tu main está en miprograma.c podrías ya compilar con:

gcc -o apli1 miprograma.c -L/librerias/ -lentrada
(La opción -l busca libentrada.a -añade automáticamente el prefijo lib y el sufijo .a- en los directorios "estandar" y en los indicados en -L)

Respecto al Codeblocks, ni idea, no lo usé jamás, pero imagino que debes crear dos proyectos: uno para la librería y otro para la aplicación y que este último tenga como dependencia al primero.
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:Code in header?????

Publicado por eduardo (82 intervenciones) el 31/08/2009 14:35:44
Hola, decidí mover la librería libentrada.a dentro de la carpeta lib de la instalación del compilador. Pero cuando intento hacer:
gcc -o aplic1 miprograma.c -L/lib/-lentrada
me manda el siguiente error:
C:DOCUMEN~1eduardoCONFIG~1Temp/cc2158bj.o:notas.c:(.text +0x402): undefined reference to '_obtRealPos'
collect2: ld returned 1 exit status

obtRealPos es una de las funciones que utiliza main() y una de las que escribí para la librería.
Una pregunta más, qué hago con el header entrada.h, ¿debería ir dentro de la carpeta include de la instalación o no? ya que main() usa la directiva:
#include <entrada.h>

Y como dato adicional se me había olvidado mencionar que trabajo con WinXp :)
Gracias y disculpa la molestia.
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:Code in header?????

Publicado por Tom (619 intervenciones) el 01/09/2009 08:42:30
No sé ... quizás le estés pasando algún parámetro del tipo incorrecto a obtRealPos ... porque debería funcionar.

Aps! puede que tu compilador (es posible, no lo sé) prefiera que el fuente donde esté el main, se llame como la aplicación, es decir:

gcc -o miprograma miprograma.c -L/lib/ -lentrada

El .h pues sí, en algún directorio include.

Te cuento como organizaría yo mis directorios, como ejemplo (es fácil trasladarlo a Window$, HOME es tu carpeta personal):

$(HOME)/projects/lib/
aquí quedaría libentrada.a y cualquier librería "pública".

$(HOME)/projects/include/
aquí iría entrada.h y cualquier cabecera "pública".

$(HOME)/projects/aplic1/
aquí irían los fuentes (c y cabeceras) de aplic1, en tu caso miprograma.c

$(HOME)/projects/libentrada/
para los fuentes (c y cabeceras) de la librería libentrada.a
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:Code in header?????

Publicado por eduardo (82 intervenciones) el 30/08/2009 16:33:36
Dejo los links de las páginas en las cuales me apoyé.

http://www.chuidiang.com/clinux/herramientas/librerias.php
http://arco.esi.uclm.es/~david.villa/doc/repo/librerias/librerias.html
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