2011-02-12 8 views
5

Cuando la construcción de mi ++ proyecto de pequeña C, consigo los siguientes 2 errores, no puede averiguar la causa:error al declarar adelante una estructura: "tiene una declaración anterior aquí"

  • de error: el uso de typedef -name 'TTF_Font' después de 'struct'.
    Hace referencia a la siguiente línea de código: struct TTF_Font; en Foo.h.

  • error: 'TTF_Font' tiene una declaración previa aquí.
    Indica la siguiente línea de código: typedef struct _TTF_Font TTF_Font; en SDL_ttf.h.

me he reducido a los siguientes archivos en un nuevo proyecto de prueba:

foo.h:

#ifndef FOO_H 
#define FOO_H 

struct TTF_Font; 

class Foo 
{ 
    TTF_Font* font; 
}; 

#endif // FOO_H 

foo.cpp:

#include "Foo.h" 
#include "SDL/SDL_ttf.h" 

// No implementation, just testing 

Principal .cpp:

#include "Foo.h" 
int main(int argc, const char* argv[]) 
{ 
    Foo a; 
    return 0; 
} 

¿Ustedes saben lo que estoy haciendo mal?

Mi objetivo es reenviar declarar TTF_Font, por lo que puedo usarlo en mi archivo de cabecera sin incluir el archivo de encabezado SDL_ttf. Leí que incluir los archivos de encabezado en otros archivos de encabezado era una mala práctica, así que cambié a las declaraciones de reenvío. Todas mis otras declaraciones forward funcionan bien excepto esta estructura única.

Cuando reemplazo la declaración directa struct TTF_Font; con el encabezado incluido #include "SDL/SDL.ttf.h", se compila sin errores. Entonces puedo usar eso, pero quiero saber POR QUÉ, maldición :-).

Información adicional: Estoy usando Code :: Blocks IDE con el compilador mingw32. Project usa la biblioteca de gráficos SDL. Todavía no hay mucha experiencia en C++, proviene del pasado C#.

+0

¿Estás seguro de que el fragmento de código para 'Foo.cpp' es correcto? El mensaje de error implica que las cosas en 'Foo.h' están ocurriendo * después de * la inclusión de' SDL_ttf.h'. –

Respuesta

8

Está tratando de reenviar declarar algo como un tipo diferente de lo que realmente es.

Usted está declarando:

struct TTF_Font; 

cuando el mensaje de error indica que TTF_Font es en realidad un typedef, no un struct:

typedef struct _TTF_Font TTF_Font; 

El stuct se llama en realidad _TTF_Font.

Se puede declarar las mismas typedef varias veces lo que sólo puede utilizar la declaración typedef en lugar de la declaración hacia adelante para declarar la struct e introducir el typedef aunque se siente un poco como está usando detalles de implementación de la cabecera que se están tratando de diferir incluidos.

+2

¡Gracias! Cuando uso la misma línea typedef del archivo de encabezado, funciona, pero como ya mencionaste, está usando los detalles del archivo de encabezado SDL_ttf. ¿Hay una mejor práctica para este tipo de cosas? ¿Debería simplemente omitir la declaración directa y simplemente incluir el archivo de encabezado en casos como este? –

+2

@void_Foo: Generalmente, incluir el archivo de encabezado es la opción más segura. Si hay una manera aceptable de reenviar declarar algo desde una biblioteca o un archivo de encabezado "solo declaraciones", la documentación de la biblioteca debería indicarlo. –

2

El problema es que en este fragmento de código:

struct foo_t; 

typedef struct foo { ... } foo_t; 

La primera línea es una visión de declaración de una estructura diferente, cuyos enfrentamientos con la typedef nombre. La declaración directa en este caso debe ser struct foo;, porque el nombre del struct en sí es foo.

Cuestiones relacionadas