udefinert C struct fremover erklæring

stemmer
19

Jeg har en header fil port.h, port.c, og min main.c

Jeg får følgende feilmelding: 'porter' bruk udefinert struct 'port_t'

Jeg tenkte som jeg har erklært struct i min .h fil og ha selve strukturen i .c filen var ok.

Jeg må ha frem erklæring som jeg ønsker å skjule noen data i min port.c fil.

I min port.h har jeg følgende:

/* 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;
}

Mange takk for alle forslag,

Publisert på 07/03/2009 klokken 05:19
kilden bruker
På andre språk...                            


4 svar

stemmer
25

Dessverre, må kompilatoren å vite størrelsen på port_t(i byte), mens kompilering main.c, så du trenger full typedefinisjon i topptekstfilen.

Svarte 07/03/2009 kl. 05:22
kilden bruker

stemmer
15

Hvis du ønsker å skjule interne data i port_tstrukturen kan du bruke en teknikk som hvordan standard bibliotek håndterer FILEstedene. Client kode kun omhandler FILE*elementer, slik at de ikke trenger (ja, da kan vanligvis ikke) ha noen kunnskap av hva som faktisk er i FILEstrukturen. Ulempen med denne metoden er at den klientkoden ikke bare kan erklære en variabel for å være av den type - de kan bare ha pekere til det, slik at gjenstanden må opprettes og ødelegges ved hjelp av noen API, og alle anvendelser av objektet må være noe gjennom-API.

Fordelen med dette er at du har et fint og rent grensesnitt til hvordan port_tgjenstander skal brukes, og lar deg holde private ting privat (ikke-private ting trenger getter / setter-funksjoner for klienten å få tilgang til dem).

Akkurat som hvordan FIL I / O er håndtert i C-bibliotek.

Svarte 07/03/2009 kl. 06:54
kilden bruker

stemmer
6

En felles løsning som jeg bruker:

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

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

Du bruker port_p i funksjonsgrensesnitt. Du må lage spesielle malloc (og gratis) wrappers i port.h også:

port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);
Svarte 07/03/2009 kl. 14:25
kilden bruker

stemmer
0

Jeg vil anbefale en annen måte:

/* 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;
}

Det er generelt ikke bra å definere variabler i en header fil.

Svarte 07/03/2009 kl. 13:25
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more