C ++ शब्दार्थ `स्थैतिक कास्ट` बनाम` कास्ट`


149

C ++ में विशेष रूप से, उदाहरण के लिए शब्दार्थ अंतर क्या हैं:

static const int x = 0 ;

तथा

const int x = 0 ;

दोनों के लिए staticएक कड़ी और एक भंडारण वर्ग विनिर्देशन (यानी के अंदर और बाहर एक समारोह) के रूप में।


7
staticशायद C ++ में सबसे अधिक ओवरलोड किया गया कीवर्ड है। आपके कोड का अर्थ व्यापक रूप से इस बात पर निर्भर करता है कि यह नाम स्थान के दायरे में है, वर्ग के दायरे में, या कार्यक्षेत्र पर। आप इसे स्पष्ट करना चाह सकते हैं।
भारतीय स्टेट बैंक

1
@ एसबी: मुझे लगा कि मैंने पहले ही कर दिया है। फंक्शन स्कोप (जहां यह स्टोरेज क्लास स्पेसियर है) और फाइल स्कोप (जहां यह लिंकेज स्पेसियर है)। वर्ग के सदस्य और नाम स्थान के स्कोप किए गए चर विशेष रूप से इस प्रश्न के संबंध में मेरे लिए चिंता का विषय नहीं हैं, हालांकि अगर किसी को लगता है कि कोई दिलचस्प अंतर है, तो उसे भी कवर करने के लिए स्वतंत्र महसूस करें।
क्लिफोर्ड

@ क्लिफोर्ड: मुझे खेद है कि मैंने उन अंतिम शब्दों को अनदेखा कर दिया। बहरहाल, यह अपनी ओर से एक गलतफहमी का पता चला: में सी ++, फ़ाइल गुंजाइश है नाम स्थान गुंजाइश। यदि आप किसी भी नाम स्थान के बाहर कुछ भी घोषित करते हैं, तो यह बस वैश्विक नामस्थान से संबंधित होगा (और ::सामने पहचानकर्ता के साथ उपसर्ग के माध्यम से सुलभ है )। मुझे वैश्विक नामस्थान और किसी भी नामस्थान के बीच किसी भी सार्थक अंतर के बारे में पता नहीं है। staticवस्तुओं के संबंध में कोई बात नहीं है ।
भारतीय स्टेट बैंक

1
लिंकेज दृश्यता से अलग है , उनका उपयोग करके आप जिस व्यक्ति से बात करते हैं और शायद खुद भी आपको भ्रमित कर रहे हैं।
बेन वोइग्ट

1
@Ben, @sbi: मैंने यह सुझाव देने का इरादा नहीं किया कि फ़ाइल स्कोप और स्टैटिक लिंकेज एक ही थे, केवल स्टैटिक लिंकेज का मतलब है कि फ़ाइल स्कोप। इस अर्थ में स्कोप (या दृश्यता) स्टेटिक और एक्सटर्नल लिंकेज का एक गुण है, या तो इसका पर्याय नहीं। मुझे लगता है कि मूल प्रश्न स्पष्ट और अच्छी तरह से बना हुआ है, और हम केवल sbi की कुछ कृपालु टिप्पणी के जवाब में की गई टिप्पणियों पर चर्चा कर रहे हैं। हम अपनी समझ के बजाय यहां अंग्रेजी के शब्दार्थ पर चर्चा कर रहे हैं, इसलिए मुझे लगता है कि हम रोक सकते हैं।
क्लिफोर्ड

जवाबों:


128

फ़ाइल स्कोप में, C ++ में कोई अंतर नहीं है। constआंतरिक लिंकेज को डिफ़ॉल्ट बनाता है, और सभी वैश्विक चर में स्थिर जीवनकाल होता है। लेकिन पहले वेरिएंट का C में समान व्यवहार है, इसलिए इसका उपयोग करने का एक अच्छा कारण हो सकता है।

एक फ़ंक्शन के भीतर, दूसरे संस्करण को मापदंडों से गणना की जा सकती है। C या C ++ में कुछ अन्य भाषाओं की तरह संकलन-समय स्थिर होना आवश्यक नहीं है।

एक वर्ग के भीतर, मूल रूप से कार्यों के लिए एक ही बात है। एक उदाहरण constमूल्य को ctor-initializer-list में परिकलित किया जा सकता है । static constस्टार्टअप प्रारंभ के दौरान ए सेट किया जाता है और बाकी कार्यक्रम के लिए अपरिवर्तित रहता है। (नोट: staticसदस्यों के लिए कोड थोड़ा अलग दिखता है क्योंकि घोषणा और आरंभीकरण अलग हो जाते हैं।)

याद रखें, C ++ में, केवल पढ़ने काconst मतलब है , स्थिर नहीं । यदि आपके पास एक पॉइंटर-टू- है, तो प्रोग्राम के अन्य हिस्सों का मूल्य बदल सकता है जबकि आप नहीं देख रहे हैं। यदि चर के साथ परिभाषित किया गया था , तो कोई भी इसे आरंभीकरण के बाद नहीं बदल सकता है लेकिन आरंभीकरण अभी भी मनमाने ढंग से जटिल हो सकता है।constconst


1
क्या फाइल स्कोप नाम की कोई चीज है? मैं सिर्फ $ 3.3 की जाँच कर रहा था और मुझे लगता है कि निकटतम 'नेमस्पेस स्कोप' है। क्या मेरी समझ सही है? C ++ 03 मानक में केवल परिशिष्टों में फाइल स्कोप का उल्लेख है
Chubsdad

2
मेरा सुझाव है कि फ़ाइल गुंजाइश संकलक के बजाय लिंकर का एक गुण है, इसलिए भाषा मानक में अधिक ध्यान नहीं दिया जा सकता है। सख्ती से यह शायद "संकलन इकाई गुंजाइश" है।
क्लिफर्ड

8
वाक्यांश के लिए +1 "कॉन्स्ट का मतलब है केवल पढ़ने के लिए, स्थिर नहीं", अर्थात, "कंपाइलर, यदि आप किसी को इस कॉस्ट चीज़ को संशोधित करने की कोशिश करते हुए देखते हैं, तो बहुत जोर से छालें।" यही कारण है कि कुछ एक ही समय में स्थिर और अस्थिर हो सकता है।
दान

5
यह अधिक "कम्पाइलर है, यदि आप मुझे इस कास्ट चीज़ को संशोधित करने की कोशिश करते हैं (या किसी और को ऐसा करने की अनुमति दें)," जोर से भौंकें। अधिकांश संदर्भ में, constचर के दृश्य पर लागू होता है और स्वयं चर नहीं होता है, किसी और के पास एक constही चर का गैर- दृश्य हो सकता है, और संकलक काफी मौन होगा जब वे इसे संशोधित करेंगे।
बेन वोयगट

1
@ बान: स्पष्ट होने के लिए, C ++ 0x उस विशेष उपयोग को नहीं हटाता है const, लेकिन नए constexprका उपयोग इसके बजाय (और अन्य स्थितियों में भी) किया जा सकता है। दरअसल, C ++ 0x मानक constउस परिदृश्य में उपयोग करने की क्षमता को गैर-अभिन्न "शाब्दिक प्रकार" के रूप में अच्छी तरह से विस्तारित करता है । मुझे लगता है कि मैं constexprउन मामलों के लिए उपयोग करना पसंद करूंगा , क्योंकि आप वैसे भी पूर्व-सी ++ 0x संकलक के साथ पिछड़े संगतता को तोड़ रहे हैं।
माइकल बूर

4

फ़ाइल स्कोप पर C ++ 17 मानक ड्राफ्ट constका अर्थ हैstatic

यह जो उल्लेख किया गया था, उसके लिए यह उद्धरण है: https://stackoverflow.com/a/3709257/895245

C ++ 17 n4659 मानक ड्राफ्ट 6.5 "प्रोग्राम और लिंकेज":

3 एक नाम जिसमें नेमस्पेस स्कोप है (6.3.6) का आंतरिक लिंकेज है अगर यह नाम है

  • (3.1) - एक चर, फ़ंक्शन या फ़ंक्शन टेम्पलेट जिसे स्पष्ट रूप से स्थिर घोषित किया गया है; या,
  • (3.2) - गैर-वाष्पशील कास्ट-योग्य प्रकार का एक गैर-इनलाइन चर जिसे न तो स्पष्ट रूप से बाहरी घोषित किया जाता है और न ही पहले बाहरी लिंकेज के लिए घोषित किया जाता है; या
  • (3.3) - एक अनाम संघ का डेटा सदस्य।

अनुलग्नक C (सूचनात्मक) संगतता, C.1.2 क्लाज 6: "मूल अवधारणाएं" का तर्क देता है कि इसे इस से क्यों बदला गया था:

6.5 [भी 10.1.7]

परिवर्तन: फ़ाइल गुंजाइश का एक नाम जिसे स्पष्ट रूप से कास्ट घोषित किया गया है, और स्पष्ट रूप से बाहरी घोषित नहीं किया गया है, में आंतरिक लिंकेज है, जबकि सी में यह बाहरी लिंकेज होगा।

Rationale: क्योंकि C ++ में अनुवाद के दौरान कास्ट ऑब्जेक्ट्स का उपयोग मानों के रूप में किया जा सकता है, यह फीचर प्रोग्रामर से प्रत्येक कॉन्स्टेंट ऑब्जेक्ट के लिए एक स्पष्ट इनिशियलाइज़र प्रदान करने का आग्रह करता है। यह सुविधा उपयोगकर्ता को एक से अधिक अनुवाद इकाई में शामिल स्रोत फ़ाइलों में कास्ट ऑब्जेक्ट डालने की अनुमति देती है।

मूल सुविधा पर प्रभाव: अच्छी तरह से परिभाषित सुविधा के शब्दार्थ में परिवर्तन।

परिवर्तित करने की कठिनाई: शब्दार्थ परिवर्तन।

व्यापक रूप से कैसे उपयोग किया जाता है: शायद ही कभी।

यह भी देखें: जब C में नहीं होता है तो C ++ में आंतरिक संबंध क्यों बनता है?

आप हेडर के बजाय क्या करना चाहते हैं

विस्तार से बताया गया है: C और C ++ में 'स्थैतिक स्थैतिक' का क्या अर्थ है?

  • पूर्व C ++ 17: externहेडर में, cpp फ़ाइल में परिभाषा
  • C ++ 17 पोस्ट करें: हेडर पर इनलाइन वैरिएबल

धन्यवाद, हालांकि मुझे नहीं लगता कि यह C ++ 98 के साथ तुलना में भी C ++ 17 में एक मौका है, और प्रश्न 2010 में पूछा गया था। इसके अलावा, आपका उत्तर केवल एक लिंकेज स्पेसर के रूप में (नाम स्थान पर गुंजाइश) के रूप में स्थिर है। , और विभिन्न संदर्भों में शब्दार्थ के बारे में विशेष रूप से पूछा गया प्रश्न।
क्लिफर्ड

@ क्लिफर्ड हां, निश्चित रूप से C ++ 17 से अधिक पुराना है, सभी मानकों को पढ़ने के लिए सिर्फ आलसी ;-) फ़ाइल गुंजाइश भाग को स्पष्ट करेगा।
सिरो संतिली 郝海东 冠状 iro 事件 法轮功 '26
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.