es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Algunos encabezados se incluyen dentro de otros.

No puedo resolver el siguiente problema:

//foo.h

#ifndef FOO_H
#define FOO_H

#include "BAR.h"
#include "foos/foo_bazz.h"

typedef struct
{
   ...
} FOO;

// AQUÍ TENGO LA LLAMADA foo_baz(foo, bar);
void
foo_bar(FOO *foo, BAR *bar);

#endif /* FOO_H */


//bar.h

#ifndef BAR_H
#define BAR_H

typedef struct
{
   ...
} BAR;

#endif /* BAR_H */


//foos/foo_bazz.h

#ifndef FOO_BAZZ_H_
#define FOO_BAZZ_H_

#include "FOO.h"
#include "BAR.h"

void
foo_baz(FOO *foo, BAR *bar);

#endif /* FOO_BAZZ_H_ */

Por lo que aparece un error como este:

foos/foo_bazz.h: error: unknown type name ‘FOO’; did you mean ‘FOO_H_’?
   16 |     FOO *foo,
      |     ^~~~
      |     FOO_H_

He intentado eliminar #include "FOO.h" y agregar typedef struct FOO; o typedef struct FOO FOO; en foos/foo_bazz.h, pero no ha habido cambios…

También he intentado hacer lo contrario, declarar la función en FOO.h, pero el resultado es el mismo.

Por favor, ayúdame. Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error es causado por la función foo_baz en foos/foo_bazz.h sin reconocer la estructura FOO de FOO.h. Una solución podría ser declarar la estructura FOO en foos/foo_bazz.h antes de la función foo_baz. Puede hacer esto agregando struct FOO; antes de la declaración de la función:

    //foos/foo_bazz.h
    #ifndef FOO_BAZZ_H_
    #define FOO_BAZZ_H_
    
    #include "BAR.h"
    
    struct FOO; // Declaración previa
    
    void foo_baz(struct FOO* foo, BAR* bar);
    
    #endif /* FOO_BAZZ_H_ */
    

    Esto le indica al compilador que FOO es una estructura que existe en algún lugar, pero no necesariamente donde está definida.

    Otra opción sería incluir FOO.h en foos/foo_bazz.c, donde se implementa la función foo_baz, en lugar de en el archivo de encabezado.

    //foos/foo_bazz.c
    #include "FOO.h"
    #include "BAR.h"
    #include "foos/foo_bazz.h"
    
    void foo_baz(FOO* foo, BAR* bar)
    {
       ...
    }
    

    De esta forma, FOO.h solo se incluye donde se necesita y no en cada archivo que usa foos/foo_bazz.h.

Comments are closed.