मैं अभी भी काम पर एक और कोड आधार पर आया हूं जहां डेवलपर्स स्ट्रक्चर के बजाए प्रतिलिपि/तुलना/सेटिंग करते समय लगातार structs के पहले तत्व के पते का उपयोग करते हैं। यहां एक साधारण उदाहरण है।संरचना के बजाय तत्व के पहले तत्व का पता क्यों उपयोग करें?
void bar(foo_t *inp)
{
foo_t l;
...
memcpy(&l.a, &inp->a, sizeof(foo_t));
...
}
मैं अपने आप को कि रास्ते में memcpy
के लिए एक कॉल लिख नहीं होगा:
typedef struct {
int a;
int b;
} foo_t;
तो फिर वहाँ एक समारोह है कि इस तरह के एक struct की एक प्रतिलिपि बनाता है:
पहले वहाँ एक struct प्रकार है और मैंने संदेह के साथ शुरुआत की कि मूल डेवलपर्स ने सी में काफी पॉइंटर्स और structs को समझ नहीं लिया है। हालांकि, अब मैंने इसे दो असंबद्ध कोड अड्डों में देखा है, बिना किसी सामान्य डेवलपर्स के साथ, इसलिए मैं खुद को संदेह करना शुरू कर रहा हूं।
कोई इस शैली का उपयोग क्यों करना चाहेगा?
नीचे दिए गए कोई भी जवाब वास्तव में सी के मेरे ज्ञान में कुछ भी नहीं जोड़ा गया था, जिस तरह से मैं उम्मीद कर रहा था;) – Magnus
यह बहुत उपयोगी है जब विशेष रूप से कई प्रकार की संरचना उसी तत्व के साथ शुरू होती है, जैसे कि छद्म विरासत। सीपीथन कोडबेस इसका उपयोग 'पायओब्जेक्ट' के साथ भारी रूप से करता है; सभी पायथन ऑब्जेक्ट्स 'पायओब्जेक्ट' सदस्य से शुरू होते हैं, और वे आमतौर पर 'पायओब्जेक्ट *' पॉइंटर्स के साथ पास हो जाते हैं, इसलिए आपको उस ऑब्जेक्ट के वास्तविक प्रकार को हार्डकोड करने की आवश्यकता नहीं है जिसके साथ आप काम कर रहे हैं। – user2357112
'memcpy' सुरक्षित हो जाता है यदि यह अंतिम तर्क है:' sizeof (foo_t) - ऑफ़सेट (foo_t, a) '। –