Skip to content

Unione con struct anonima con membro di array flessibile

I nostri migliori sviluppatori hanno esaurito le loro scorte di caffè, cercando giorno e notte la risposta, finché Regina non ha trovato la risposta su Gogs, quindi oggi la condividiamo con noi.

Soluzione:

NOTA: questa risposta è stata modificata in modo sostanziale dalla prima stesura, riflettendo un cambiamento della posizione della commissione dopo la pubblicazione dei documenti su cui si basava la versione originale della risposta.

I membri di una struttura o unione anonima sono considerati membri della struttura o unione contenente.

Si tratta di una disposizione difficile da interpretare, e in effetti è stata oggetto di almeno due segnalazioni di difetti nei confronti dello standard. L'intenzione, come sostenuto dalla commissione nella risposta al DR 499, è che le strutture anonime siano trattate, ai fini del layout, come se la struttura stessa fosse un membro della struttura o unione contenente, ma l'accesso ai suoi membri sia espresso come se fossero membri della struttura o unione contenente.

La posizione accettata sul DR 502, invece, sostiene che anche una struct anonima che contiene un membro di un array flessibile come suo membro solo è consentito se è l'ultimo membro della struttura (non unione) che lo contiene e se almeno un altro lo precede.

Trovo questi elementi un po' incoerenti, ma il tema unificante sembra essere che l'intento dello standard in quest'area si riduce a disposizione. Un membro di un array flessibile all'interno di una struttura anonima è consentito purché arrivi alla fine del layout della struttura o dell'unione denominata più interna, che deve avere dimensioni non nulle considerando gli altri membri, tenendo conto del fatto che i membri di una struttura anonima non si sovrappongono, indipendentemente dal fatto che la struttura anonima appaia all'interno di un'unione.

La proposta di risposta della commissione al DR 502 (che differisce dalla posizione iniziale) è coerente con questo punto. Essa ritiene che le strutture anonime all'interno di una struttura o di un'unione debbano obbedire alle stesse regole delle altre strutture per quanto riguarda i membri di array flessibili, nonostante la disposizione di cui si chiede.

La commissione non sembra aver deciso in merito alla domanda specifica che avete posto, ma il tema delle sue decisioni sembra chiaro: la formulazione "considerati membri della struttura o dell'unione che li contiene" deve essere interpretata in modo restrittivo, come un'affermazione solo sulla sintassi per l'accesso ai membri di strutture e unioni anonime. Pertanto, questa disposizione non ha nulla da dire sul fatto che le strutture anonime possano o meno contenere FAM, e le regole generali su quando e dove possono essere applicate. Tali regole consentono il primo caso.

Il secondo caso non si compila, perché il membro flessibile dell'array è una proprietà di un tipo di struttura, non per le unioni. Questo è semplice.

Successivamente, nel primo caso, il tentativo di accedere a b[0] sarebbe un comportamento non definito, poiché non è stata allocata memoria per questo.

Citazione C11, §6.7.2.1/P18

Come caso particolare, l'ultimo elemento di una struttura con più di un membro nominato può
avere un elemento in utilizzare l'allocazione dinamica della memoria (o qualche altro meccanismo) per allocare un'unione o una struttura con spazio sufficiente per una FAM non vuota. Commenti simili valgono anche per il secondo esempio.

Qualche nome dice in un commento

Ma poiché nel primo caso la struttura è anonima, i membri della struttura dovrebbero essere considerati come membri dell'unione contenente, rendendo l'unione un array flessibile. Come ho citato I membri di una struttura o unione anonima sono considerati membri della struttura o unione contenente.

Si noti che la struttura anonima non perde la sua forma solo perché è incorporata in una unione. Una differenza è che l'offset di bin union test non può essere 0, il che è completamente diverso dai normali membri di un'unione. Normalmente, tutti i membri di un'unione iniziano con l'offset 0. Per lo più, però, ciò significa che data una variabile union test u;è possibile fare riferimento a u.a e u.b. In passato si sarebbe dovuto specificare un nome per la struttura: union test { struct { int a; int b[]; } s; }; e utilizzare u.s.a o u.s.b per accedere agli elementi della struttura all'interno dell'unione. Questo non influisce sul punto in cui un membro di un array flessibile è consentitoed; solo la notazione utilizzata per accedervi.

Ti invitiamo a incoraggiare la nostra missione pubblicando un commento o lasciando una valutazione, ti diamo il benvenuto.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.