Ein Fehler in der GCC-Implementierung von Bitfeldern

Arbeitet in C11 die folgende Struktur:

struct S {
  unsigned a : 4;
  _Bool    b : 1;
};

Wird von GCC alsunsigned (4 Bytes) von denen 4 Bits verwendet werden, gefolgt von a_Bool (4 Bytes) von denen 1 Bit verwendet wird, für eine Gesamtgröße von 8 Bytes.

Beachten Sie, dass C99 und C11 dies ausdrücklich zulassen_Bool als Bitfeldmitglied. Der C11-Standard (und wahrscheinlich auch C99) besagt unter §6.7.2.1 'Struktur- und Vereinigungsspezifizierer' ¶11 auch Folgendes:

Eine Implementierung kann eine beliebige adressierbare Speichereinheit zuweisen, die groß genug ist, um ein Bitfeld zu halten. Wenn noch genügend Platz vorhanden ist, wird ein Bitfeld, das unmittelbar auf ein anderes Bitfeld in einer Struktur folgt, in benachbarte Bits derselben Einheit gepackt.

Also ich glaube, dass das Mitgliedb oben sollte in die für das Mitglied zugewiesene Speichereinheit gepackt worden seinaDies führt zu einer Struktur mit einer Gesamtgröße von 4 Bytes.

GCC verhält sich korrekt und das Packen findet statt, wenn für beide Elemente die gleichen Typen verwendet werden oder wenn einer verwendet wirdunsigned und der anderesigned, aber die Typenunsigned und_Bool scheinen von GCC als zu unterschiedlich angesehen zu werden, als dass es sie richtig handhaben könnte.

Kann jemand meine Interpretation des Standards bestätigen, und dass dies tatsächlich ein GCC-Fehler ist?

Ich interessiere mich auch für ein Workaround (einige Compiler-Schalter, Pragma,__attribute__...).

Ich benutze gcc 4.7.0 mit-std=c11 (obwohl andere Einstellungen dasselbe Verhalten zeigen.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage