मैंने एसओ पर बाहरी/आंतरिक संबंधों पर मौजूदा प्रश्नों को पढ़ा है। मेरा प्रश्न अलग है - क्या होता है यदि मेरे पास C
और C++
के अंतर्गत विभिन्न अनुवाद इकाइयों में बाहरी लिंकेज के साथ एक ही चर के एकाधिक परिभाषाएं हैं?सी और सी ++ के बीच संबंध में अंतर?
उदाहरण के लिए:
/*file1.c*/
typedef struct foo {
int a;
int b;
int c;
} foo;
foo xyz;
/*file2.c*/
typedef struct abc {
double x;
} foo;
foo xyz;
देव-सी ++ का उपयोग करते हुए और एक सी कार्यक्रम के रूप में, उपरोक्त कार्यक्रम को संकलित करता है और लिंक पूरी तरह से; जबकि यह एक सीडी ++ प्रोग्राम के रूप में संकलित किया गया है, तो यह एक बहु redininition त्रुटि देता है। इसे सी के तहत क्यों काम करना चाहिए और सी ++ के साथ क्या अंतर है? क्या यह व्यवहार अपरिभाषित और संकलक-निर्भर है? यह कोड कितना "बुरा" है और अगर मैं इसे दोबारा बनाना चाहता हूं तो मुझे क्या करना चाहिए (मैं इस तरह लिखे गए पुराने कोड में आया हूं)?
सी व्यवहार आपके कार्यान्वयन पर सच हो सकता है लेकिन इसकी भाषा द्वारा गारंटी नहीं है। –
एक चर नाम एक स्मृति पता के लिए सिर्फ एक लेबल है। यदि आप उस लेबल को समझने के लिए दो परिभाषाएं प्रदान करते हैं, तो यह जादू को दो अलग-अलग ऑब्जेक्ट्स का तर्क नहीं देता है। क्या आपने कभी एक लिंकर देखा है जो उस पर अलग व्यवहार करेगा? –
मैं इनकार नहीं करता कि यह सामान्य लिंकर व्यवहार है, यह व्यवहार अन्य भाषाओं और कई सी कार्यान्वयनों द्वारा उपयोग किया जाता है। हालांकि, आपके उत्तर से निहितार्थ यह था कि यह एक अच्छी तरह से परिभाषित व्यवहार है। सी मानक अनुलग्नक जे के मुताबिक, एक कार्यक्रम में एक से अधिक बाहरी परिभाषाओं को एक आम विस्तार देना है, लेकिन इस विस्तार के साथ भी यदि परिभाषाएं सहमत नहीं हैं तो यह अपरिभाषित व्यवहार में परिणाम देती है। –