C typedef og Struct Spørsmål

stemmer
10

Hva er forskjellen mellom disse to erklæringer, og er en foretrukket framfor den andre?

typedef struct IOPORT {  
    GPIO_TypeDef* port;  
    u16           pin;  
} IOPORT;  

typedef struct {  
    GPIO_TypeDef* port;  
    u16           pin;  
} IOPORT;  
Publisert på 10/07/2009 klokken 17:37
kilden bruker
På andre språk...                            


5 svar

stemmer
15

det første kan du bruke IOPORT inne i struct for å henvise til objekter av samme type. nyttig i tilfeller som er knyttet lister hvor en node har til å referere til en node.

Svarte 10/07/2009 kl. 17:39
kilden bruker

stemmer
8

C har fire forskjellige navneområder, hvor strukturen taggen navnerom er en av dem. Derfor:

struct foo { int bar; };

definerer ikke en ny type i generell forstand. Når du bare har en struktur tag, må du foranstille søkeordet 'struct' i objekt erklæringer som dette:

foo b; /* error */
struct foo b; /* correct */

I tillegg kan du instantiate et nytt objekt med en gang i definisjonen slik:

struct foo { int bar; } baz;

Hvor Bas er et formål med strukturtype foo. Men ønsker man ofte å definere en struktur som en ny type, for å spare litt skriving. En komplett type refererer ikke til strukturkoder, slik at du kan utelate 'struct' prefikset under erklæringer.

typedef struct foo { int bar; } baz;

Likevel lar deg erklære objekter med 'struct foo', siden foo er struct tag. Men nå er det forfremmet til en full type i "normal" type navnerom, der det er kjent som type baz. Så med en typedef, den 'Baz' feltet (e) har forskjellige semantikk.

Med mindre du trenger å erklære pekere til strukturen typen inni seg selv (lenkede lister, trestrukturer), utelater det. Legge til en som ikke er nødvendig bare forurenser navnerom.

Svarte 02/11/2009 kl. 22:30
kilden bruker

stemmer
7

Såvidt hvilken stil foretrekkes, jeg foretrekker første stil (med navnet i både struct-koden og som et typedef for struct) rett og slett fordi det ikke er noen andre enn noen få flere tegn i kildefilen ulemper. Min IDE struct biten faller navnet på begge steder, så jeg får alltid en typedef'ed struct navn sammen med en struct kodenavn.

Du får noen små fordeler:

  • den " struct STRUCTNAME" kan brukes til å erklære pekere til struct i struct
  • du kan komme unna med bare å bruke STRUCTNAME i enten C eller C ++ kode
  • du forhindre en mulig (selv om svært sjelden i praksis) særhet i C ++ som har å gjøre med struct navn blir brukt til et annet formål uten feil eller advarsel

Men, hvis jeg måtte manuelt skrive i struct definisjon, vil jeg ofte dovent forsømmelse erklære den ene eller den andre navn.

Svarte 10/07/2009 kl. 18:08
kilden bruker

stemmer
0

For å få til lesbarhet er det foretrukket å uttrykke den opprinnelige eksempel i en form som for eksempel:

typedef struct IOPORT_t {  
    GPIO_TypeDef* port;  
    u16           pin;  
} IOPORT; 

.... som understreker forskjellen mellom type og forekomst.

Videre, hvis du ønsker å legge initialisers kan du gjøre noe sånt som:

typedef struct IOPORT_t {  
    GPIO_TypeDef* port;  
    u16           pin;  
} IOPORT;

struct IOPORT_t IOPORT2 = {
    .port = NULL,
    .pin = 25
  };

eller du kan miste typedefå initialisere den direkte:

struct IOPORT_t {  
    GPIO_TypeDef* port;  
    u16           pin;  
} IOPORT = {
    .port = NULL,
    .pin = 24
  };

struct IOPORT_t IOPORT2 = {
    .port = NULL,
    .pin = 25
  };
Svarte 18/09/2019 kl. 12:24
kilden bruker

stemmer
0

Det første eksemplet kan du bruke objekt i seg selv for ting ligge lenkede lister og trær (som Victor påpeker ). Den andre er et eksempel på anonyme typer som erfaring har lært ikke oppfører seg pent med alle kompilatorer. Så den første tilnærmingen er trolig anbefales. Hvis du ikke er opptatt av struct å kunne referere seg selv kan du alltids gi det et navn som er usannsynlig å komme i konflikt som __SOMEPREFIX_IOPORT__ for eksempel.

Svarte 10/07/2009 kl. 17:46
kilden bruker

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