dichiarazione in avanti C struct non definita
-
05-07-2019 - |
Domanda
Ho un file di intestazione port.h, port.c e il mio main.c
Ricevo il seguente errore: 'porte' usa una struttura non definita 'porta_t'
Ho pensato come ho dichiarato la struttura nel mio file .h e avere la struttura effettiva nel file .c era ok.
Devo avere la dichiarazione anticipata poiché voglio nascondere alcuni dati nel mio file port.c.
Nel mio port.h ho il seguente:
/* 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;
}
Mille grazie per eventuali suggerimenti,
Soluzione
Sfortunatamente, il compilatore deve conoscere la dimensione di port_t
(in byte) durante la compilazione di main.c, quindi è necessario la definizione completa del tipo nel file di intestazione.
Altri suggerimenti
Se vuoi nascondere i dati interni della struttura port_t
puoi usare una tecnica come la libreria standard che gestisce gli oggetti FILE
. Il codice client si occupa solo degli elementi FILE *
, quindi non hanno bisogno (anzi, quindi generalmente non possono) avere alcuna conoscenza di ciò che è effettivamente nella struttura FILE
. Lo svantaggio di questo metodo è che il codice client non può semplicemente dichiarare che una variabile è di quel tipo - possono avere solo puntatori ad essa, quindi l'oggetto deve essere creato e distrutto usando alcune API e tutto gli usi dell'oggetto devono essere attraverso alcune API.
Il vantaggio è che hai una bella interfaccia pulita su come usare gli oggetti port_t
e ti consente di mantenere le cose private private (le cose non private hanno bisogno di funzioni getter / setter per il client per accedervi).
Proprio come viene gestito l'I / O FILE nella libreria C.
Una soluzione comune che utilizzo:
/* port.h */
typedef struct port_t *port_p;
/* port.c */
#include "port.h"
struct port_t
{
unsigned int port_id;
char name;
};
Si utilizza port_p nelle interfacce delle funzioni. Dovrai creare anche wrapper malloc (e gratuiti) speciali in port.h:
port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);
Vorrei raccomandare un modo diverso:
/* 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;
}
In genere non è utile definire le variabili in un file di intestazione.