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,

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top