यह C ++ और C. दोनों में परिभाषित किया गया है। यह सख्त अलियासिंग नियमों का उल्लंघन नहीं करता है क्योंकि यह परिणामी सूचक को बाधित नहीं करता है।
यहाँ C ++ से उद्धरण (@interjay और @VTT के लिए धन्यवाद) जो इसे अनुमति देता है:
ऑब्जेक्ट पॉइंटर को एक अलग प्रकार के ऑब्जेक्ट पॉइंटर में स्पष्ट रूप से परिवर्तित किया जा सकता है।
यहाँ C से उद्धरण (धन्यवाद @StoryTeller) है जो इसे अनुमति देता है:
एक ऑब्जेक्ट प्रकार के लिए एक पॉइंटर को एक अलग ऑब्जेक्ट प्रकार के लिए एक पॉइंटर में परिवर्तित किया जा सकता है।
ये निर्दिष्ट करते हैं कि एक पॉइंटर प्रकार को दूसरे पॉइंटर प्रकार में परिवर्तित किया जा सकता है (और फिर वैकल्पिक रूप से परिवर्तित किया गया) बिना परिणाम के।
और यहाँ POSIX का उद्धरण है जो इस विशिष्ट मामले की अनुमति देता है:
Sockaddr_in संरचना इंटरनेट पते के परिवार के लिए पतों को स्टोर करने के लिए किया जाता है। सॉकेट फ़ंक्शंस के साथ उपयोग के लिए इस प्रकार के पॉइंट्स को संरचना sockaddr * के अनुप्रयोगों द्वारा डाला जाएगा ।
जैसा कि यह फ़ंक्शन ( bind
) सी मानक लाइब्रेरी का हिस्सा है, जो कुछ भी अंदर जाता है (विशेष रूप से, टाइप-कास्ट पॉइंटर को डीफ्रेंफिनिंग करता है) में अपरिभाषित व्यवहार नहीं होता है।
अधिक सामान्य प्रश्न का उत्तर देने के लिए:
C और C ++ दो अलग-अलग भाषाएं हैं। यदि कुछ C में परिभाषित है, लेकिन C ++ में नहीं, तो वह C में परिभाषित है, लेकिन C ++ में नहीं। दोनों भाषाओं के बीच कोई निहित संगतता नहीं बदलेगी। यदि आप उस कोड का उपयोग करना चाहते हैं जो C में अच्छी तरह से परिभाषित है लेकिन C ++ में अपरिभाषित है, तो आपको उस कोड को संकलित करने के लिए C कंपाइलर का उपयोग करना होगा।