Tom struktur i C

stemmer
10

Jeg har en struktur med ingen medlemmer (for øyeblikket), og jeg vil gjerne vite om det er mulig å undertrykke advarsel jeg får:

warning: struct has no members

Er det mulig å legge til et medlem og holde sizeofstruct null? Enhver annen løsning?

Publisert på 16/04/2009 klokken 09:04
kilden bruker
På andre språk...                            


7 svar

stemmer
19

hvis du bare trenger struct symbol for støping og funksjonsargumenter så bare:

typedef struct _Interface Interface;

Dette vil skape symbolet for en ugjennomsiktig type.

Svarte 26/05/2011 kl. 09:53
kilden bruker

stemmer
18

Ic virkemåten til en tom struktur er avhengig av kompilatoren versus c ++ hvor det er en del av spec ( forklaringer her )

C ++
En klasse med en tom sekvens av medlemmer og basen klasse objekter er en tom klasse. Komplett gjenstander og medlemsunderobjekter av en tom klasse type skal ha ikke-null størrelse.

i C er det heller mer skummel fordi C99 standarden har noen språk som innebærer at virkelig tomme strukturer ikke er tillatt (se TrayMan svar), men mange kompilatorer tillater det (f.eks gcc ).

Siden dette er kompilatoren avhengig er det lite sannsynlig at du vil få virkelig bærbar kode i dette tilfellet. Som slike ikke-bærbare måter å undertrykke advarselen kan være det beste alternativet.

Svarte 16/04/2009 kl. 09:17
kilden bruker

stemmer
10

Teknisk sett er dette ikke engang gyldig C.

TrayMan var litt av i sin analyse, ja 6.2.6.1 sier:

Med unntak av bit-felt, blir gjenstander sammensatt av sammenhengende sekvenser av en eller flere bytes, antall, rekkefølge, og koding av disse er enten eksplisitt spesifisert eller implementerings definert.

men tie at med 6.2.5-20, som sier:

- En strukturtype beskriver et sekvensielt avsatt ikketom sett av medlems gjenstander (og, i visse tilfeller, et ufullstendig array), som hver har en eventuelt spesifisert navn og muligens distinkt type.

og nå kan du konkludere med at strukturene skal være en eller flere byte fordi de ikke kan være tom. Koden gir deg en advarsel, mens den samme koden faktisk klarer å kompilere på Microsofts Visual Studio med en feil:

error C2016: C krever at en struct eller union har minst ett medlem

Så det korte svaret er nei, det er ikke en bærbar måte å unngå denne advarselen, fordi det forteller du at du bryter C-standarder. Du må bruke en kompilator bestemt linje for å undertrykke det.

Svarte 14/03/2013 kl. 17:30
kilden bruker

stemmer
4

C99 standard er noe tvetydig på dette, men ser ut til å si at en tom struct skal ha ikke-null størrelse.

6.2.6.1 Med unntak av bit-felt, blir gjenstander sammensatt av sammenhengende sekvenser av en eller flere bytes, antall, rekkefølge, og koding av disse er enten eksplisitt spesifisert eller implementerings definert.

Svarte 16/04/2009 kl. 09:27
kilden bruker

stemmer
2

Er det mulig å legge til et medlem og holde sizeof struct null?

Nei. FWIW, lar C ++ tomme structs men sizeof () er alltid forskjellig fra null for en tom struct.

Enhver annen løsning?

Ikke noen enkel seg. Det er verdt å merke seg at tomme structs er bare noe som støttes i C og forbudt i C99.

Tomme structs støttes i C ++, men forskjellige kompilatorer implementere dem med varierende resultater (for sizeof og struct forskyvninger), spesielt når du begynner å kaste arv inn i miksen.

Svarte 28/05/2009 kl. 08:08
kilden bruker

stemmer
1

Hvis du ikke krever "for streng" tilslutning, kan du komme unna med dette:

struct empty {
  char nothing[0];
};

Dette er en GCC forlengelse , skjønt.

Jeg håper slags jeg ville være i stand til å bruke C99 funksjon kalt "fleksible matriser", erklærte som dette:

struct empty99
{
  char nothing[]; // This is a C99 "flexible array".
};

men som ikke fungerer; de krever at det er minst ett medlem normal struct først, kan de ikke være det eneste medlemmet.

Svarte 16/04/2009 kl. 09:14
kilden bruker

stemmer
0
struct zero_information { int:0; };

Ovennevnte kodebiten vil gi en non -Null verdi fra sizeof(struct zero_information), men det kan hjelpe deg å få det du leter etter som 100% av all bagasje som er avsatt til det, er padding (kun tilgjengelig gjennom hacks, selv om jeg ikke husker fra toppen av hodet mitt hvis tiltrer utfyllingen er udefinert atferd).

Svarte 10/05/2013 kl. 09:37
kilden bruker

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