Ich lief in einen großen Nutzen von anonymen union
. Seien Sie jedoch gewarnt, dies ist keine Geschichte für schwache Nerven, noch ist es eine empfohlene Praxis. In einem älteren C-Programm von Hunderten von Quellcodedateien gibt es eine globale Variable, eine struct
, die eine struct
als Mitglied enthielt. So ist die Typdefinition für die globale Variable sah etwas, was wie:
typedef struct {
LONG lAmount;
STRUCTONE largeStruct; // memory area actually used for several different struct objects
ULONG ulFlags;
} STRUCTCOMMON;
Die struct
, STRUCTONE, war einer von mehreren großen structs aber die anderen waren alle kleiner als STRUCTONE zum Zeitpunkt der Code geschrieben wurde. Dieser Speicherbereich largeStruct
wurde also als union
verwendet, aber ohne die entsprechenden Quellanweisungen. Stattdessen wurden verschiedene struct
Variablen in diesen Bereich unter Verwendung von memcpy()
kopiert.Um das Ganze noch schlimmer zu machen, geschah dies manchmal durch den tatsächlichen Namen der globalen Variablen und manchmal durch einen Zeiger auf die globale Variable.
Wie in der Regel passiert, wie die Zeit fortschreitet letzten Änderungen führten zu einer der anderen Strukturen die größte. 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. So modifizierte ich die typedef
, die folgenden sein:
typedef struct {
LONG lAmount;
union {
// anonymous union to allow for allocation of largest space needed
STRUCTONE largeStruct; // memory area actually used for several different struct objects
STRUCTTHREE largerStruct; // memory area for even larger struct
};
ULONG ulFlags;
} STRUCTCOMMON;
Und dann alles neu kompiliert.
So all die Tage der Quellcode-Überprüfung und Regressionstests, auf die ich mich unglücklich freute, sind nicht mehr notwendig.
Und ich kann jetzt den Prozess der langsamen Änderung der Quelle mit dieser globalen beginnen, um diese Quelle zu moderneren Standards auf meinem eigenen Zeitplan zu bringen.
mögliche Duplikate von [Was sind anonyme Strukturen und Vereinigungen nützlich in C11?] (Http://stackoverflow.com/questions/8932707/what-are-anonymous-structs-and-union-useful-for-in-in- c11) –