Pregunta

Tengo un archivo de encabezado port.h, port.c y mi main.c

Me sale el siguiente error: 'ports' usa una estructura indefinida 'port_t'

Pensé que ya que había declarado la estructura en mi archivo .h y que la estructura real en el archivo .c estaba bien.

Necesito tener la declaración de reenvío ya que quiero ocultar algunos datos en mi archivo port.c.

En mi puerto.h tengo lo siguiente:

/* port.h */
struct port_t;

port.c:

/* port.c */
#include "port.h"
struct port_t
{
    unsigned int port_id;
    char name;
};

main.c:

/* main.c */
#include <stdio.h>
#include "port.h"

int main(void)
{
struct port_t ports;

return 0;
}

Muchas gracias por cualquier sugerencia,

¿Fue útil?

Solución

Desafortunadamente, el compilador necesita saber el tamaño de port_t (en bytes) mientras compila main.c, por lo que necesita la definición de tipo completo en el archivo de encabezado.

Otros consejos

Si desea ocultar los datos internos de la estructura port_t , puede usar una técnica como la forma en que la biblioteca estándar maneja los objetos FILE . El código del cliente solo se ocupa de los elementos FILE * , por lo que no necesitan (de hecho, generalmente no pueden) tener ningún conocimiento de lo que realmente está en la estructura FILE . El inconveniente de este método es que el código del cliente no puede simplemente declarar que una variable sea de ese tipo: solo pueden tener punteros, por lo que el objeto debe crearse y destruirse usando alguna API y todos los usos del objeto tienen que ser a través de alguna API.

La ventaja de esto es que tiene una interfaz agradable y limpia de cómo se deben usar los objetos port_t , y le permite mantener las cosas privadas en privado (las cosas no privadas necesitan funciones getter / setter para el cliente para acceder a ellos).

Al igual que la gestión de E / S de ARCHIVO en la biblioteca de C.

Una solución común que uso:

/* port.h */
typedef struct port_t *port_p;

/* port.c */
#include "port.h"
struct port_t
{
    unsigned int port_id;
    char name;
};

Utiliza el puerto_p en las interfaces de función. Necesitará crear envoltorios especiales de malloc (y gratis) en port.h también:

port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);

Recomendaría una forma diferente:

/* port.h */
#ifndef _PORT_H
#define _PORT_H
typedef struct /* Define the struct in the header */
{
    unsigned int port_id;
    char name;
}port_t;
void store_port_t(port_t);/*Prototype*/
#endif

/* port.c */
#include "port.h"
static port_t my_hidden_port; /* Here you can hide whatever you want */
void store_port_t(port_t hide_this)
{
    my_hidden_port = hide_this;
}

/* main.c */
#include <stdio.h>
#include "port.h"
int main(void)
{
    struct port_t ports;
    /* Hide the data with next function*/
    store_port_t(ports);
    return 0;
}

Generalmente no es bueno definir variables en un archivo de encabezado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top