C में कांस्टेबल क्वालिफायर और C ++ में कॉस्ट क्वालिफायर के बीच क्या अंतर है?


9

मुझे उपयोगकर्ता R की एक टिप्पणी मिली .. :

C और C ++ समान भाषा नहीं हैं। विशेष रूप से, C constका C ++ से कोई लेना-देना नहीं है const

मुझे पता है, कि constसी में constक्वालिफायर और सी ++ में क्वालिफायर के बीच एक अंतर इसका डिफ़ॉल्ट लिंकेज है।

constC ++ में क्वालीफायर के साथ नेमस्पेस स्कोप में घोषित ऑब्जेक्ट में आंतरिक लिंकेज होता है, जबकि C में एक ऑब्जेक्ट constको ग्लोबल स्कोप पर क्वालिफ़ायर घोषित किया जाता है ( staticपहले क्वालीफ़ायर हुए बिना const) बाहरी लिंकेज होता है।

लेकिन वे दोनों C और C ++ की भाषाओं के बीच कैसे भिन्न हैं? मैंने सोचा है कि दोनों भाषाओं में एक ही तरह की अवधारणा और उद्देश्य हैं।

मेरा प्रश्न:

  • C में कांस्टेबल क्वालिफायर और C ++ में कॉस्ट क्वालिफायर के बीच क्या अंतर है?

"कॉन्स्ट" के उत्तर C और C ++ में कैसे भिन्न हैं? क्वालीफायर के संदर्भ में सी और सी ++ की भाषाओं के बीच एक सटीक अंतर को इंगित न करें const। केवल आप जो कर सकते हैं या एक निश्चित भाषा में कर सकते हैं।


इतने सारे जवाब बस एक Google खोज दूर। उनमें से एक: stackoverflow.com/questions/4486442/…
schaiba

1
सी में, constलिंकेज से कोई लेना-देना नहीं है। आपके पास static constफाइल स्कोप हो सकता है और इसमें इंटरनल लिंकेज है,
लुंडिन

3
यदि आप उस प्रश्न के वर्तमान उत्तरों से नाखुश हैं - जो आपके जैसा ही है - तो उस पर एक इनाम पोस्ट करने पर विचार करें।
स्नेफेल

3
मैं मानता हूं कि लिंक की गई डुप्लिकेट खराब है। एक अच्छा जवाब सभी मतभेदों को सूचीबद्ध करेगा और constदोनों भाषाओं में एक जैसा क्या करता है, यह समझाने के लिए नहीं।
लुंडिन

1
मैं इस तरह के उत्तर को लिखने का प्रयास कर सकता हूं, लेकिन मैं यह सुनिश्चित करने के लिए पर्याप्त नहीं हूं कि मैंने सभी अंतरों को कवर किया है। मेरे सिर के शीर्ष पर: C ++ में const वैरिएबल निरंतर अभिव्यक्ति हैं, C C ++ के विपरीत सदस्य कार्यों को योग्य बना सकते हैं। उल्लिखित लिंकेज। और कुछ?
लुंडिन

जवाबों:


11
  • सबसे महत्वपूर्ण अंतर यह है कि सी ++ में एक constचर एक स्थिर अभिव्यक्ति है (यहां तक ​​कि सी ++ 11 की शुरूआत से पहले constexpr), लेकिन constसी में एक चर नहीं है।

    मतलब यह है कि C ++ आपको चीजों को करने की अनुमति देता है const size_t n = 1; static int array[n];लेकिन C ऐतिहासिक कारणों से माना जाता है कि अनुमति नहीं देता है।

  • सी ++ में, constलिंकेज निर्धारित करने में भूमिका निभाता है। यह C ++ वर्जन के बीच अलग है। Cppreference.com (जोर मेरा) के अनुसार :

    नेमस्पेस दायरे में घोषित निम्न नामों में से किसी में आंतरिक संबंध हैं:


    • गैर-वाष्पशील गैर-टेम्पलेट (C ++ 14 के बाद से) गैर-इनलाइन (C ++ 17 के बाद से) गैर-निर्यात (C ++ 20 के बाद से) कांस्टेबल -योग्य चर (कॉन्स्टैक्स सहित) जिन्हें बाहरी घोषित नहीं किया गया है और ' टी पहले बाहरी लिंकेज की घोषणा की है;

    जबकि सी में, constलिंकेज का निर्धारण करने में कोई भूमिका नहीं निभाता है - केवल घोषणा क्षेत्र और भंडारण वर्ग निर्दिष्टकर्ता पदार्थ।

  • C ++ में, आप constसदस्य कार्यों को अर्हता प्राप्त कर सकते हैं । यह C में संभव नहीं है क्योंकि इसमें सदस्य कार्यों के लिए सिंटैक्स समर्थन नहीं है।

  • C, constबिना इनिशियलाइज़र के घोषित किए जा सकने वाले अयोग्य वेरिएबल्स को अनुमति देता है। C में, हम const int x;बिना इनिशलाइज़र के लिख सकते हैं , लेकिन C ++ इसकी अनुमति नहीं देता है। एक नज़र में, यह C में एक संवेदनहीन भाषा बग की तरह लग सकता है, लेकिन तर्क यह है कि कंप्यूटर में हार्डवेयर द्वारा निर्धारित मानों के साथ केवल-पढ़ने के लिए हार्डवेयर रजिस्टर होते हैं, न कि सॉफ्टवेयर। मतलब कि C हार्डवेयर से संबंधित प्रोग्रामिंग के लिए उपयुक्त है।


क्या आप C में सदस्य कार्य कर सकते हैं?
मैक्सिम Egorushkin

1
ध्यान दें कि const size_t n = 1; static int array[n];केवल तभी काम करता है जब कंपाइलर की परिभाषा देख सकता है nऔर निरंतर प्रचार कर सकता है। extern const size_t n; static int array[n];काम नहीं करता है।
मैक्सिम इगोरुशिन

हम्म, मैं ऐसे हार्ड वेयर रजिस्टरों को पॉइंटर्स के माध्यम से संबोधित करते हुए देखता हूं, जैसे uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
एकॉनगुआ

@Aconcagua बाकी रजिस्टर मैप के साथ ऐसे रजिस्टर को असंगत बना देगा। और यह आपको डिबगर में वास्तविक रजिस्टर मूल्यों को देखने में कैसे सक्षम करेगा? उदाहरण के लिए यदि आप केवल पढ़ने के लिए केवल सिलिकॉन मास्क सेट रजिस्टर देखना चाहते हैं, तो यह देखने के लिए कि आपने किस भाग को समाप्त किया है। और जाहिर है, आपको volatileपॉइंटर क्वालीफाई करने की भी आवश्यकता होगी ।
लुंडिन

@ लुंडिन ने स्वीकार किया, इस पर ध्यान नहीं दिया गया volatile... बाकी निर्भर करता है। इन मामलों में मेरे पास मौजूद डिबगर्स आसानी से हल कर सकते थे *x। दूसरी ओर, यदि रजिस्टरों को कुछ मेमोरी क्षेत्र में मैप किया जाता है और संकलक विशिष्ट मेमोरी स्थानों पर चर रखने का समर्थन नहीं करता है (मैंने दोनों को देखा है), विशिष्ट मेमोरी स्थान पर चर प्राप्त करना कभी-कभी थोड़ा गड़बड़ हो सकता है (मानचित्र फ़ाइल में इसे कवर करने के लिए ...)। अंत में मुझे सही जगह या पॉइंटर पर स्थित एक वैरिएबल के बारे में ज्यादा परवाह नहीं है, जब तक मुझे वह काम मिल सकता है जो मुझे सौंपा गया है;)
एकॉनकागुआ

0

से cppreference.com :

constएक गैर-स्थानीय गैर वाष्पशील गैर टेम्पलेट की घोषणा पर इस्तेमाल किया क्वालीफायर गैर इनलाइन (के बाद से सी ++ 17) चर घोषित नहीं किया गया है (सी ++ 14 के बाद से) externयह देता है आंतरिक लिंकेज। यह C से भिन्न है जहाँ constफ़ाइल स्कोप चर में बाहरी लिंकेज है।

इसके अलावा constसी और सी ++ और सी हेडर में समान शब्दार्थ constहैं, जिन्हें अक्सर सशर्त के साथ सी ++ हेडर के रूप में संकलित किया जाता है "extern C"


1
यह एक खराब उद्धरण है, ओवरसिम्प्लीफिकेशन। static const x;C में फ़ाइल स्कोप में आंतरिक लिंकेज है। सी चर का लिंकेज निर्धारित किया जाता है कि यह किस स्कोप में घोषित किया गया है, साथ ही स्टोरेज क्लास स्पेसर्स की उपस्थिति / अनुपस्थिति। constऔर अन्य प्रकार के क्वालीफायर इसका हिस्सा नहीं खेलते हैं।
लुंडिन

@ लुंडिन यह कैसे बोली से अलग है?
मैक्सिम Egorushkin

1
मैंने जो उदाहरण दिया, वह उद्धरण को गलत साबित करता है। उद्धरण के अनुसार, static const x;C में फ़ाइल स्कोप में बाहरी लिंकेज है।
लुंडिन

@ लुंडिन बोली कहती है कि int const x = 1C में बाहरी जुड़ाव है । इसलिए, आपको staticलिंकेज को आंतरिक में बदलना होगा। आपकी टिप्पणियों के विपरीत उद्धरण मेरे लिए बहुत स्पष्ट है।
मैक्सिम Egorushkin

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