Tecnicamente non è nemmeno valido C.
TrayMan era un po 'fuori nella sua analisi, sì 6.2.6.1 dice:
Except for bit-fields, objects are composed of contiguous sequences of one or more bytes, the number, order, and encoding of which are either explicitly specified or implementation-defined.
ma legame che con 6.2.5-20, che dice:
— A structure type describes a sequentially allocated nonempty set of member objects (and, in certain circumstances, an incomplete array), each of which has an optionally specified name and possibly distinct type.
e ora si può Concludo che le strutture saranno uno o più byte perché non possono essere vuoti. Il vostro codice che sta dando un avvertimento, mentre lo stesso codice sarà effettivamente riuscire a compilare su Visual Studio di Microsoft con un errore:
error C2016: C requires that a struct or union has at least one member
Quindi la risposta breve è no, non c'è un modo portatile per evitare questo avviso, perché ti sta dicendo che stai violando gli standard C. Dovrai usare un'estensione specifica del compilatore per sopprimerla.
Perché è necessario che la dimensione sia zero? –
Perché ho un'interfaccia privata (in cui ho la mia struct zero size perché non implemento una determinata functionnality) e un'interfaccia pubblica in cui alcune delle mie strutture private diventano opache e devono avere le stesse dimensioni di quelle private. – claf
Il mio sistema di build controlla la dimensione della struct privata e crea la struttura pubblica con un "char _opaque [SIZEOF_PRIVATE_STRUCT]". – claf