Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Buenas. Problemas Con .c Y .h

Iniciado por shephiroth, 20 de Noviembre de 2005, 05:20:52 AM

« anterior - próximo »

shephiroth

 Muy buenas.

Yo hasta el momento trabajaba en windows. Estaba todo feliz, creando proyectos, con el cpp inicial, y a partir de ahi todo archivos .h, sin problema de ningun tipo, en todas las clases declaradas en los archivos .h no necesitaba incluir nada, y podia acceder a todo........pero recientemente (weno, llevo ya casi dos meses) empece a portarme y a aprender en linux. Aqui empezó mi debacle.

Buscando informacion vi que todo estaba en archivos .c (fuente) con sus respectivo .h (cabecera). Encontre informacion sobre os archivos makefile, y me cree el makefile para mi proyecto. Todo pintaba de perlas. El archivo principal cpp con todo junto, genial, todo funcionaba. He separado algunas cosillas en sus archivos .c y .h correspondientes, donde apilaba funciones propias de similitud uso (en uno las funciones para hacer MD5, en otro las funciones para abrir diferentes tipos de imagenes, etc....). Por ultimo llego el problema, un archivo .c y .h que utiliza funciones de otros archivos y del cpp principal. Me saltan errores por todos lados, y termino de enterarme como hacerlo.

Despues de explicaros un poco el problema por encima, paso a explicarlo un poco mas "graficamente":

ventana.cpp [Archivo principal]

#ifdef WIN32
...
#else
...
#endif //Incluyo opengl y las basicas del compilador

struct datospantalla;
void main();
void bucle();
void crearpantalla();
void render();

#include "linuxdef.h"
#include "windef.h"
#include "eventosBase.h"
#include "eventosPintar.h"


Weno, no quiero hacer esto mas grande de lo debido. Basicamente, en la clase eventosPintar utilizo la funcion render().....pero claro, no me la da valida >_<

Lo primero que pense seria un #include "ventana.cpp" pero me resulta un poco lioso y no he querido ni intentarlo. En el makefile tengo establecido q ventana.cpp es el principal, y q para codifiarlo primero tiene q crear eventosPintar.o, entonces no es logico q en eventosPintar.c se necesite de ventana.cpp........

Pues eso, q necesito un poco de "Orientacion Basica" en como organizar mis proyectos ^^;

GRACIAS  

gdl

 ¿Probaste a ponerle un .h al programa principal con las funciones que exporta?

Warchief

Cita de: "shephiroth"Weno, no quiero hacer esto mas grande de lo debido. Basicamente, en la clase eventosPintar utilizo la funcion render().....pero claro, no me la da valida >_<

Lo primero que pense seria un #include "ventana.cpp" pero me resulta un poco lioso y no he querido ni intentarlo. En el makefile tengo establecido q ventana.cpp es el principal, y q para codifiarlo primero tiene q crear eventosPintar.o, entonces no es logico q en eventosPintar.c se necesite de ventana.cpp........

Pues eso, q necesito un poco de "Orientacion Basica" en como organizar mis proyectos ^^;

GRACIAS
Los archivos de cabecera (.h) son lo que los demás archivos pueden ver de un módulo. Digamos que un .h es la API de funcionalidad que da el módulo y el .cpp (c++) o el .c © la implementación. Si quieres que alguien que no sea ventana.cpp pueda usar una función suya has de:

Ventana.h

void render(); // Declarar la función para que sea accesible desde otros


Ventana.cpp

#include "Ventana.h" // Para conocer las declaraciones

void renderPrivado();

void render()
{
... // Implementación
}

void renderPrivado()
{
... // Implementación
}




Otra.cpp

#include "Ventana.h"

void mifunc()
{
    render(); // Puedo usarla porque ventana.h la exporta
    renderPrivado(); // No puedo usarla, es un símbolo no definido en este nivel
}



Lo que hace un #include a todos los efectos es copiar el contenido del .h donde haces el include, por lo que relamente Otra.cpp sería como poner:


void render(); // Declarar la función para que sea accesible desde otros (por el include de ventana.h)

void mifunc()
{
    render(); // Puedo usarla porque ventana.h la exporta
    renderPrivado(); // No puedo usarla, es un símbolo no definido en este nivel
}



shephiroth

 Muchas gracias, ya me quedo claro :)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.