我只是跑進匿名union
一個巨大的好處。不過要注意的是,這不是一個暗戀的故事,也不是一個推薦的做法。
在一個包含數百個源代碼文件的早期C程序中,有一個全局變量struct
,其中包含一個struct
作爲成員。因此,對於全局變量的類型定義神情有些東西一樣:
typedef struct {
LONG lAmount;
STRUCTONE largeStruct; // memory area actually used for several different struct objects
ULONG ulFlags;
} STRUCTCOMMON;
的struct
,STRUCTONE,是幾個大的結構一個不過其他人在這個代碼寫的時間比STRUCTONE所有小。所以這個內存區域largeStruct
被當作union
使用,但沒有正確的源語句表明如此。而是使用memcpy()
將各種變量struct
複製到此區域。更糟的是,有時這是通過全局變量的實際名稱,有時是通過指向全局變量的指針。
通常隨着時間的推移最近的變化導致其中一個結構成爲最大的結構。我面臨着不得不通過一百個文件尋找這個被使用的地方以及所有不同的別名和其他所有內容。
然後我想起匿名工會。所以我修改了typedef
爲以下:
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;
然後重新編譯每一件事情。
所以現在所有這些日子的源代碼審查和迴歸測試我都不高興地期待不再需要。
我現在可以開始慢慢修改源代碼的過程,使用這個全局代碼將這個源代碼更新到我自己的時間表上更現代的標準。
可能的重複[什麼是在C11中有用的匿名結構和聯合?](http://stackoverflow.com/questions/8932707/what-are-anonymous-structs-and-unions-useful-for-in- c11) –