मैं सिर्फ गुमनाम union
की एक बड़ी लाभ में फंस गयी। हालांकि चेतावनी दी जानी चाहिए कि यह बेहोश दिल की कहानी नहीं है और न ही यह एक अनुशंसित अभ्यास है।
स्रोत कोड के सैकड़ों के एक पुराने सी कार्यक्रम में फ़ाइलों को वहाँ एक वैश्विक चर, एक struct
है, जो एक सदस्य के रूप में एक struct
निहित है।
typedef struct {
LONG lAmount;
STRUCTONE largeStruct; // memory area actually used for several different struct objects
ULONG ulFlags;
} STRUCTCOMMON;
struct
, STRUCTONE, कई बड़े structs में से एक है लेकिन दूसरों थे हर समय इस कोड को लिखा गया था पर STRUCTONE से छोटी थी: तो वैश्विक चर के लिए प्रकार परिभाषा जैसे कुछ बात देखा। तो इस स्मृति क्षेत्र, largeStruct
को union
के रूप में उपयोग किया जा रहा था, लेकिन उचित स्रोत बयान के बिना ऐसा संकेत मिलता है। memcpy()
का उपयोग करके इस क्षेत्र में विभिन्न struct
चर की प्रतिलिपि बनाई गई थी।कभी-कभी मामलों को और भी खराब बनाने के लिए यह वैश्विक चर के वास्तविक नाम और कभी-कभी वैश्विक चर के सूचक के माध्यम से होता था।
आमतौर पर ऐसा होता है जैसे हालिया परिवर्तनों में प्रगति होती है जिसके परिणामस्वरूप अन्य structs सबसे बड़े होते हैं। और मुझे एक सौ फाइलों से गुज़रने का सामना करना पड़ा जहां यह सभी विभिन्न उपनामों और अन्य सभी चीज़ों के साथ उपयोग किया जा रहा था।
और फिर मुझे अज्ञात यूनियन याद आया। इसलिए मैं 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;
और फिर हर चीज कंपाइल।
तो अब स्रोत कोड समीक्षा और प्रतिगमन परीक्षण के उन सभी दिनों में मैं दुखी था कि अब और आवश्यक नहीं है।
और अब मैं इस स्रोत का उपयोग करके धीरे-धीरे स्रोत को संशोधित करने की प्रक्रिया शुरू कर सकता हूं ताकि इस स्रोत को अपने समय सारणी पर अधिक आधुनिक मानकों तक पहुंचाया जा सके।
स्रोत
2016-02-18 23:49:24
संभावित डुप्लिकेट [अज्ञात structs और यूनियन सी 11 में उपयोगी क्या हैं?] (Http://stackoverflow.com/questions/8932707/what-are-anonymous-structs-and-unions-useful-for-in- सी 11) –