Wo ist struct ohne benannte Mitglieder nützlich?

8

Warum und wo lässt der C-Standard diesen Code kompilieren? Wo ist es nützlich?

%Vor%     
The Mask 04.10.2013, 21:33
quelle

3 Antworten

5

Das wäre in §6.7.2.1 Struktur- und Gewerkschaftsspezifizierer

  

12) Eine Bitfeld-Deklaration ohne Deklarator, aber nur ein Doppelpunkt und eine Breite, zeigt an   unbenanntes Bitfeld. 126

Die Fußnote erklärt, warum solche Dinge existieren:

  

126 Ein unbenanntes Bit-Feld-Strukturelement ist nützlich, damit Padding extern zugewiesenen Layouts entspricht.

Gleichwohl heißt es im selben Teil des Standards (Absatz 8) auch:

  

Wenn die struct-declaration-list keine benannten Member enthält, weder direkt noch über eine anonyme Struktur oder eine anonyme Union, ist das Verhalten undefiniert.

Aber einige Compiler (GCC und zumindest Clong) erlauben dies trotzdem, als Erweiterung.

Die Verwendung ist ein bisschen begrenzt, wenn das das einzige Bitfeld in der Struktur ist, aber nicht unmöglich zu verwenden, wie ouah veranschaulicht .

Der Standard fährt mit einer anderen "Kuriosität" fort:

  

Als Spezialfall gibt ein Bitfeldstrukturelement mit einer Breite von 0 an, dass kein weiteres Bitfeld in die Einheit gepackt werden soll, in der das vorherige Bitfeld, falls vorhanden, platziert wurde.

    
Mat 04.10.2013, 21:38
quelle
6

Dieses Programm ruft undefiniertes Verhalten auf.

C sagt:

  

(C99, 6.7.2.1p7) "[...] Wenn die struct-declaration-list keine benannten Member enthält, ist das Verhalten nicht definiert."

Jetzt akzeptieren einige Compiler es als Erweiterung. Wie kann das nützlich sein?

Zum Beispiel für Linux Kernel berühmt BUILD_BUG_ON_ZERO Makro:

%Vor%

Um zu sehen, was dieses Makro bewirkt, können Sie hier sehen.

    
ouah 04.10.2013 21:44
quelle
3

Nun, gemäß der Sprachspezifikation, wenn Ihr Programm einen Strukturtyp ohne benannte Elemente enthält, ist das Verhalten nicht definiert. (Auf die Frage, warum es nicht offiziell als Zwangsverletzung anerkannt ist, habe ich keine unmittelbare Antwort.) Es ist in 6.7.2.1/7

angegeben
  

Die struct-declaration-list ist eine Abfolge von Deklarationen für die   Mitglieder der Struktur oder Vereinigung. Wenn die Struktur-Deklarationsliste   enthält keine benannten Mitglieder, das Verhalten ist nicht definiert.

Abgesehen davon ist eine solche Erklärung nicht wirklich "nützlich", da das einzige, was sie produziert, ein undefiniertes Verhalten ist.

    
AnT 04.10.2013 21:41
quelle

Tags und Links