Welche Vorteile haben unbenannte Strukturen / Vereinigungen in C?

8

Ich habe einen Code gefunden, der wie die unten gezeigte ähnliche Demo implementiert ist.

%Vor%

6.58 Unbenannt struct/union Felder in structs/unions

Wie von ISO C11 erlaubt.

Aber was sind Vorteile davon?

Weil ich sowieso auf die Datenmitglieder wie

zugreifen kann %Vor%

kompiliert auf gcc 4.5.2 mit,

%Vor%

und keine Fehler,

    
Omkant 14.11.2012, 09:54
quelle

3 Antworten

14

Es muss keine anonyme Struktur innerhalb einer Struktur sein, was ich nicht sehr nützlich finde: Dies wird normalerweise nur das Layout geringfügig ändern, indem mehr Auffüllung eingeführt wird, ohne andere sichtbare Effekte (im Vergleich zu den Inlinern der Kind-Struktur in die Eltern-Struktur).

Ich denke, der Vorteil der anonymen Struktur / Gewerkschaften liegt anderswo: Sie können verwendet werden, um eine anonyme Struktur innerhalb einer Union oder einer anonymen Union innerhalb einer Struktur zu platzieren.

Beispiel:

%Vor%     
Pascal Cuoq 14.11.2012, 10:29
quelle
11

Der Vorteil ist ziemlich offensichtlich, oder? Es erspart dem Programmierer einen Namen! Seit Dinge zu benennen ist schwer , es ist schön, dass es möglich ist, dies zu vermeiden, wenn es keinen wirklichen Bedarf gibt.

Es ist auch ein ziemlich klares Signal, dass diese struct lokal ist und nie irgendwo anders benutzt wird, sondern im Kontext eines Feldes in der Elternstruktur, was wirklich, wirklich nette Information ist, da sie die Möglichkeit der unnötigen Kopplung.

Stellen Sie es sich als static vor; Es beschränkt die Sichtbarkeit der inneren struct auf die äußere, ähnlich wie (aber nicht natürlich äquivalent) wie static die Sichtbarkeit von globalen Symbolen auf die Kompilierungseinheit beschränkt, in der sie erscheinen.

    
unwind 14.11.2012 09:55
quelle
1

Ich habe gerade einen riesigen Vorteil von anonymous union erfahren. Seien Sie jedoch gewarnt, dies ist keine Geschichte für schwache Nerven, noch ist es eine empfohlene Praxis.

In einem älteren C-Programm mit Hunderten von Quellcodedateien gibt es eine globale Variable, eine struct , die ein struct als Mitglied enthielt. Die Typdefinition für die globale Variable sah also so aus:

%Vor%

Die struct , STRUCTONE, war eine von mehreren großen Strukturen, aber die anderen waren zum Zeitpunkt der Erstellung dieses Codes alle kleiner als STRUCTONE. Dieser Speicherbereich largeStruct wurde also als union verwendet, aber ohne die entsprechenden Quellanweisungen. Stattdessen wurden verschiedene struct Variablen mit memcpy() in diesen Bereich kopiert. Um das Ganze noch schlimmer zu machen, ging das manchmal über den tatsächlichen Namen der globalen Variablen und manchmal über einen Zeiger auf die globale Variable.

Wie es typischerweise passiert, wenn die Zeit fortschreitet, haben die letzten Änderungen dazu geführt, dass eine der anderen Strukturen die größte wurde. Und ich war damit konfrontiert, dass ich durch hundert Dateien gehen musste, um herauszufinden, wo diese verwendet wurden, zusammen mit all den verschiedenen Aliasen und allem anderen.

Und dann erinnerte ich mich an anonyme Gewerkschaften. Also habe ich typedef folgendermaßen geändert:

%Vor%

Und dann alles neu kompiliert.

Nun sind all die Tage des Quellcode-Reviews und der Regressionstests, auf die ich mich unglücklich freute, nicht länger notwendig.

Und ich kann jetzt mit dem Prozess der langsamen Änderung der Quelle beginnen, indem ich diese globale Quelle benutze, um diese Quelle zu moderneren Standards auf meinem eigenen Zeitplan zu bringen.

    
Richard Chambers 18.02.2016 23:49
quelle

Tags und Links