Ho appena incontrato un enorme vantaggio di anonimi union
. Tuttavia, tieni presente che questa non è una storia per i deboli di cuore, né è una pratica consigliata.
In un programma C precedente di centinaia di file di codice sorgente esiste una variabile globale, un struct
, che conteneva un struct
come membro. Quindi la definizione del tipo per la variabile globale sembrava qualche cosa come:
typedef struct {
LONG lAmount;
STRUCTONE largeStruct; // memory area actually used for several different struct objects
ULONG ulFlags;
} STRUCTCOMMON;
Il struct
, STRUCTONE, è stato uno dei molti grandi struct però gli altri erano tutti più piccoli STRUCTONE al momento questo codice è stato scritto. Quindi questa area di memoria, largeStruct
veniva utilizzata come union
ma senza le istruzioni di origine appropriate che lo indicano. Invece varie variabili struct
sono state copiate in quest'area utilizzando memcpy()
.A peggiorare le cose a volte ciò avveniva attraverso il nome effettivo della variabile globale e talvolta tramite un puntatore alla variabile globale.
Come accade di solito mentre il tempo procede con le ultime modifiche, una delle altre strutture è diventata la più grande. E mi sono trovato di fronte a dover esaminare un centinaio di file cercando dove fosse usato insieme a tutti i vari alias e tutto il resto.
E poi ho ricordato le unioni anonime. Così ho modificato il typedef
essere la seguente:
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;
E poi ricompilato ogni cosa.
Quindi ora tutti quei giorni di revisione del codice sorgente e test di regressione non vedevo l'ora di essere più necessario.
E ora posso iniziare il processo di modifica lentamente della sorgente utilizzando questo globale per portare questa sorgente a standard più moderni sulla mia tabella di orari.
fonte
2016-02-18 23:49:24
possibile duplicato del [Quali sono le strutture anonime e sindacati utili per a C11?] (Http://stackoverflow.com/questions/8932707/what-are-anonymous-structs-and-unions-useful-for-in- c11) –