यदि अपरिभाषित C ++ व्यवहार C परिभाषित व्यवहार से मिलता है तो क्या होता है?


10

मेरे पास एक *.cppफाइल है जिसे मैं C ++ (C C संकलक नहीं) के साथ संकलित करता हूं। युक्त फ़ंक्शन एक डाली पर निर्भर करता है (अंतिम पंक्ति देखें) जो सी में परिभाषित किया गया लगता है (कृपया सही है अगर मैं गलत हूं!), लेकिन इस विशेष प्रकार के लिए सी ++ में नहीं।

[...] C++ code [...]

struct sockaddr_in sa = {0};
int sockfd = ...;
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
bind(sockfd, (struct sockaddr *)&sa, sizeof sa);

[...] C++ code [...]

चूंकि मैं इसे C ++ फ़ाइल में संकलित करता हूं, क्या यह अब परिभाषित या अपरिभाषित व्यवहार है? या मुझे इसे एक *.cफ़ाइल में स्थानांतरित करने की आवश्यकता होगी , इसे परिभाषित व्यवहार करने के लिए?


1
फ़ाइल एक्सटेंशन का कोई अर्थ नहीं है; केवल यदि आप इसे C या C ++ के रूप में संकलित करते हैं।
फ्रेड्रिक

1
संबंधित प्रकार एक दूसरे से विरासत में नहीं मिले हैं और उनका कोई संबंध नहीं है और यह C ++ में अपरिभाषित है
डैनियल स्टीफेंस

1
आमतौर पर, यदि फ़ाइल में .cएक्सटेंशन है, तो सी कंपाइलर स्वचालित रूप से लागू होता है।
इगोर आर।

1
मैं C ++ कोड में हर समय वह ट्रिक करता हूं। पता नहीं क्यों यह आपके लिए काम नहीं करेगा। कहीं हेडर गुम हो रहा है?
user4581301

3
@DanielStephens यह प्रोग्राम कभी भी पॉइंटर को पॉइंटर करने की कोशिश नहीं करता है। कास्ट ही अनुमति है , dereferencing - केवल कभी-कभी। यदि सी साइड सही ढंग से पॉइंटर को वास्तविक प्रकार में वापस करता है तो सब कुछ ठीक होना चाहिए। यदि उन प्रकारों की अलग-अलग संरेखण आवश्यकताएं होती हैं, तो कास्टिंग के साथ समस्याएं हो सकती हैं।
user7860670 17

जवाबों:


6

यह C ++ और C. दोनों में परिभाषित किया गया है। यह सख्त अलियासिंग नियमों का उल्लंघन नहीं करता है क्योंकि यह परिणामी सूचक को बाधित नहीं करता है।

यहाँ C ++ से उद्धरण (@interjay और @VTT के लिए धन्यवाद) जो इसे अनुमति देता है:

ऑब्जेक्ट पॉइंटर को एक अलग प्रकार के ऑब्जेक्ट पॉइंटर में स्पष्ट रूप से परिवर्तित किया जा सकता है।

यहाँ C से उद्धरण (धन्यवाद @StoryTeller) है जो इसे अनुमति देता है:

एक ऑब्जेक्ट प्रकार के लिए एक पॉइंटर को एक अलग ऑब्जेक्ट प्रकार के लिए एक पॉइंटर में परिवर्तित किया जा सकता है।

ये निर्दिष्ट करते हैं कि एक पॉइंटर प्रकार को दूसरे पॉइंटर प्रकार में परिवर्तित किया जा सकता है (और फिर वैकल्पिक रूप से परिवर्तित किया गया) बिना परिणाम के।

और यहाँ POSIX का उद्धरण है जो इस विशिष्ट मामले की अनुमति देता है:

Sockaddr_in संरचना इंटरनेट पते के परिवार के लिए पतों को स्टोर करने के लिए किया जाता है। सॉकेट फ़ंक्शंस के साथ उपयोग के लिए इस प्रकार के पॉइंट्स को संरचना sockaddr * के अनुप्रयोगों द्वारा डाला जाएगा ।

जैसा कि यह फ़ंक्शन ( bind) सी मानक लाइब्रेरी का हिस्सा है, जो कुछ भी अंदर जाता है (विशेष रूप से, टाइप-कास्ट पॉइंटर को डीफ्रेंफिनिंग करता है) में अपरिभाषित व्यवहार नहीं होता है।


अधिक सामान्य प्रश्न का उत्तर देने के लिए:

C और C ++ दो अलग-अलग भाषाएं हैं। यदि कुछ C में परिभाषित है, लेकिन C ++ में नहीं, तो वह C में परिभाषित है, लेकिन C ++ में नहीं। दोनों भाषाओं के बीच कोई निहित संगतता नहीं बदलेगी। यदि आप उस कोड का उपयोग करना चाहते हैं जो C में अच्छी तरह से परिभाषित है लेकिन C ++ में अपरिभाषित है, तो आपको उस कोड को संकलित करने के लिए C कंपाइलर का उपयोग करना होगा।


1
@interjay क्या आप मानक (या तो C या C ++ ठीक है) के एक उद्धरण के साथ वापस आ सकते हैं?
एसएस ऐनी


1
@StoryTeller धन्यवाद। इसके बजाय HTTP संस्करण जोड़ा गया है।
एसएस ऐनी

2
दूसरा तर्क के लिए - बेशक यह POSIX मानक में एक दोष है bindएक होना चाहिए const void *, लेकिन bindके अस्तित्व से पहले voidसी भाषा (और सभी में सी के ++ अस्तित्व) में। उन्होंने इसे जोड़ने के लिए कुछ बिंदु पर अपडेट किया const, लेकिन मूल प्रकार को कभी तय नहीं किया।
क्रिस डोड

1
मैं इस बात की सिफारिश कर सकते youtube.com/watch?v=_qzMpk-22cc मैं अभी भी कर रहा हूँ यकीन नहीं अगर यह जवाब की पुष्टि करता है, या यदि वह वास्तव में विपरीत कह रहा है: -O सी ++ एक बुरा सपना है .. lol
डैनियल स्टीफंस

-3

सी और सी ++ कोड के बीच कॉल सभी संबंधित मानकों के दृष्टिकोण से, अपरिभाषित व्यवहार को लागू करते हैं, लेकिन अधिकांश प्लेटफ़ॉर्म ऐसी चीजों को निर्दिष्ट करते हैं।

ऐसी परिस्थितियों में जहां सी या सी ++ मानक के हिस्से और कार्यान्वयन के दस्तावेज एक साथ परिभाषित करते हैं या एक कार्रवाई का वर्णन करते हैं, लेकिन अन्य भाग इसे अपरिभाषित के रूप में चिह्नित करते हैं, कार्यान्वयन को उस प्रक्रिया में कोड संसाधित करने की अनुमति दी जाती है, जो फैशन में अपने ग्राहकों की ज़रूरतों को पूरा करेगा या - यदि वे ग्राहक की जरूरतों के प्रति उदासीन हैं - वे जो भी फैशन देखते हैं वह फिट है। तथ्य यह है कि मानक इस तरह के मामलों को अपने अधिकार क्षेत्र के बाहर का संबंध मानता है, जब विभिन्न प्रयोजनों के लिए उपयुक्तता का दावा करने वाले कब और / या कार्यान्वयन कैसे लागू होते हैं, उनसे सार्थक रूप से प्रक्रिया करने की अपेक्षा की जानी चाहिए, लेकिन कुछ संकलक अनुरक्षक एक मिथक की सदस्यता लेते हैं।


पहला पैराग्राफ: "C और C ++ कोड के बीच कॉल सभी अपरिभाषित व्यवहार को आमंत्रित करते हैं" भले ही "अपरिभाषित व्यवहार को लागू करने" जैसी कोई चीज थी (जो कि नहीं है), यह अभी भी कोई मतलब नहीं है।
को ऑर्बिट

दूसरा पैराग्राफ: आप क्या कहना चाह रहे हैं, इसका कोई अंदाजा नहीं है।
को ऑर्बिट

@LightnessRacesinOrbit मुझे लगता है कि यह जवाब मेरे [सवाल-वकील] टैग को सवाल में जोड़ने का नतीजा था। मैंने अब इसे बेहतर समझा है (उत्तर बहुत शाब्दिक हैं) और इसे हटा दिया।
एसएस ऐनी

1
@ JL2210 मुझे नहीं लगता कि यह आपकी गलती थी।
ऑर्बिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.