example - structs in java
undefined C struct forward declaraciones (4)
Tengo un archivo de encabezado port.h, port.c y mi main.c
Recibo el siguiente error: ''ports'' usa una estructura indefinida ''port_t''
Pensé que, como he declarado la estructura en mi archivo .h y tener 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 port.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;
};
C Principal:
/* main.c */
#include <stdio.h>
#include "port.h"
int main(void)
{
struct port_t ports;
return 0;
}
Muchas gracias por las sugerencias,
Desafortunadamente, el compilador necesita saber el tamaño de port_t
(en bytes) al compilar main.c, por lo que necesita la definición de tipo completa en el archivo de encabezado.
Si desea ocultar los datos internos de la estructura port_t
, puede utilizar una técnica como la forma en que la biblioteca estándar maneja los objetos FILE
. El código del cliente solo trata con los elementos de FILE*
, por lo que no necesitan (de hecho, generalmente no pueden) tener ningún conocimiento de lo que realmente está en la estructura de FILE
. El inconveniente de este método es que el código del cliente no puede simplemente declarar que una variable es de ese tipo; solo pueden tener punteros a la misma, por lo que el objeto debe crearse y destruirse usando alguna API y todos los usos del objeto. Tiene que ser a través de alguna API.
La ventaja de esto es que tiene una interfaz limpia y agradable para el port_t
objetos port_t
, y le permite mantener en privado las cosas privadas (las cosas no privadas necesitan funciones de obtención / establecimiento para que el cliente pueda acceder a ellas).
Al igual que cómo se maneja FILE I / O en la biblioteca de C.
Una solución común que utilizo:
/* port.h */
typedef struct port_t *port_p;
/* port.c */
#include "port.h"
struct port_t
{
unsigned int port_id;
char name;
};
Usas el port_p en interfaces de funciones. También deberá crear envoltorios malloc especiales (y gratuitos) en port.h:
port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);
Yo 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.