स्थैतिक कीवर्ड का पदावनति ... और नहीं?


89

C ++ staticमें एक प्रतीक की दृश्यता (या तो चर या फ़ंक्शन घोषणा) को प्रभावित करने के लिए एक अनुवाद इकाई के भीतर कीवर्ड का उपयोग करना संभव है ।

N3092 में, यह पदावनत कर दिया गया:

अनुलग्नक D.2 [depr.static]
स्थैतिक कीवर्ड का उपयोग नाम स्थान गुंजाइश में वस्तुओं की घोषणा करते समय पदावनत किया जाता है (3.3.6 देखें)।

N3225 में, इसे हटा दिया गया है।

केवल लेख मैं मिल सकता है कुछ हद तक अनौपचारिक है।

हालांकि, यह रेखांकित करता है कि C के साथ संगतता के लिए (और C- प्रोग्रामों को C ++ के रूप में संकलित करने की क्षमता) के लिए प्रतिनियुक्ति कष्टप्रद है। हालाँकि, सी प्रोग्राम को सीधे C ++ के रूप में संकलित करना पहले से ही एक निराशाजनक अनुभव हो सकता है, इसलिए यदि मैं इस पर विचार करता हूं तो मैं अनिश्चित हूं।

क्या किसी को पता है कि इसे क्यों बदला गया था?


3
आप C में नेमस्पेस स्कोप पर ऑब्जेक्ट घोषित करते हैं?
इटियेन डे मार्टेल

हेह, thx, जहां पर इसे पाने के लिए पाया। टिप्पणी हटाने का प्रयास किया गया लेकिन आपने मुझे वहां हरा दिया।
एडवर्ड स्ट्रेंज


1
यह C ++ कमेटी को मानक :-) के अगले संस्करण में कुछ स्पष्ट करने का अवसर देता है
जेम्स मैकनेलिस

जवाबों:


75

में सी ++ स्टैंडर्ड कोर भाषा दोष रिपोर्ट और स्वीकृत मुद्दे, संशोधन 94 के तहत 1012 के Undeprecating स्थिर `वे ध्यान दें:

यद्यपि 7.3.1.1 [नामस्थान_नाम] में कहा गया है कि नाम स्थान में चर घोषित करने के लिए स्थैतिक कीवर्ड का उपयोग किया जाता है क्योंकि अनाम नाम स्थान एक बेहतर विकल्प प्रदान करता है, यह संभावना नहीं है कि सुविधा भविष्य में किसी भी बिंदु पर हटा दी जाएगी ।

मूल रूप से कह रही है कि staticवास्तव में समझ में नहीं आता है। यह कभी भी C ++ से नहीं निकाला जाएगा, और यह अभी भी उपयोगी है क्योंकि आपको बॉयलरप्लेट कोड की आवश्यकता नहीं है जो आपको अनाम नामस्थान के साथ चाहिए, यदि आप केवल आंतरिक लिंकेज के साथ फ़ंक्शन या ऑब्जेक्ट घोषित करना चाहते हैं।


2
खैर, ऐसा लगता है कि पदावनति लोगों को इसके बजाय अनाम नामस्थान का उपयोग करने के लिए प्रोत्साहित करेगी, जो एक अच्छी बात होगी।
sbi

1
@ यूनापर्सन: यदि कोई अन्य कारण नहीं है, तो क्योंकि अनाम नेमस्पेस अपने टीयू को वैरिएबल, स्थिरांक, फ़ंक्शन और आंतरिक बनाने के लिए समान तंत्र प्रदान करता है। static class ... , OTOH, काम नहीं करेगा।
sbi

2
@nbt: क्योंकि आप स्टेटिक प्रतीकों को टेम्प्लेट तर्कों के रूप में उपयोग नहीं कर सकते हैं और क्योंकि कई newbies को उपयोग करने में आसानी होगी और फिर <कार्यात्मक> और <एल्गोरिथम> एट अल को आज़माने के लिए अनटमिटेड हैं। बस एक त्वरित विचार।
सेबेस्टियन मच

2
"क्योंकि आपको बॉयलरप्लेट कोड की आवश्यकता नहीं है जो आपको अनाम नामस्थान के साथ चाहिए"? "बॉयलरप्लेट कोड" क्या है? " namespace {" और " }" से परे कुछ ?
तोवी

1
@ErikAronesty यदि आपके पास उसी नाम की किसी अन्य फ़ाइल में "स्थानीय वर्ग" है तो आप ODR उल्लंघन करेंगे।
LF

32

मैं आपके प्रश्न का उत्तर देने का प्रयास करूंगा, हालांकि यह एक पुराना प्रश्न है, और यह बहुत महत्वपूर्ण नहीं लगता है (यह वास्तव में अपने आप में बहुत महत्वपूर्ण नहीं है ), और इसे पहले ही काफी अच्छे उत्तर मिल चुके हैं। इसका उत्तर देने का कारण यह है कि यह मानक विकास और भाषा डिजाइन के बुनियादी मुद्दों से संबंधित है जब भाषा मौजूदा भाषा पर आधारित होती है: जब भाषा की विशेषताओं को असंगत तरीके से हटा, हटा या बदल दिया जाना चाहिए?

C ++ में एक प्रतीक की दृश्यता (या तो चर या फ़ंक्शन घोषणा) को प्रभावित करने के लिए एक अनुवाद इकाई के भीतर स्थिर कीवर्ड का उपयोग करना संभव है।

लिंकेज वास्तव में।

N3092 में, यह पदावनत कर दिया गया:

पदावनति इंगित करता है:

  • भविष्य में कुछ सुविधा को हटाने का इरादा ; इसका मतलब यह नहीं है कि अगले मानक संशोधन में हटाए गए सुविधाओं को हटा दिया जाएगा, या उन्हें "जल्द", या सभी को हटा दिया जाना चाहिए। और गैर-हटाए गए सुविधाओं को अगले मानक संशोधन में हटाया जा सकता है।
  • इसके उपयोग को हतोत्साहित करने का एक औपचारिक प्रयास ।

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

हालांकि, यह रेखांकित करता है कि C के साथ संगतता के लिए (और C- प्रोग्रामों को C ++ के रूप में संकलित करने की क्षमता) के लिए प्रतिनियुक्ति कष्टप्रद है। हालाँकि, सी प्रोग्राम को सीधे C ++ के रूप में संकलित करना पहले से ही एक निराशाजनक अनुभव हो सकता है, इसलिए यदि मैं इस पर विचार करता हूं तो मैं अनिश्चित हूं।

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

लेकिन मुद्दा कभी भी C के साथ संगतता नहीं है, यह मौजूदा C ++ के साथ संगतता है: मौजूदा मान्य C ++ प्रोग्राम के टन हैं जो staticवैश्विक घोषणाओं का उपयोग करते हैं । यह कोड केवल औपचारिक रूप से कानूनी नहीं है, यह ध्वनि है, क्योंकि यह एक अच्छी तरह से परिभाषित भाषा सुविधा का उपयोग करता है जिस तरह से इसका उपयोग करने का इरादा है

सिर्फ इसलिए कि अब कुछ करने के लिए एक "बेहतर तरीका" (कुछ के अनुसार) है जो पुराने तरीके से लिखे गए कार्यक्रमों को "बुरा" या "अनुचित" नहीं बनाता है। staticवैश्विक दायरे में वस्तुओं और कार्यों की घोषणाओं पर कीवर्ड का उपयोग करने की क्षमता को C और C ++ दोनों समुदायों में अच्छी तरह से समझा जाता है, और सबसे अधिक बार सही ढंग से उपयोग किया जाता है।

एक समान नस में, मैं सी-स्टाइल कास्ट्स doubleको static_cast<double>सिर्फ इसलिए बदलने नहीं जा रहा हूं क्योंकि "सी-स्टाइल की कास्ट खराब है", जैसा कि static_cast<double>शून्य जानकारी और शून्य सुरक्षा को जोड़ता है।

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

कोड परिवर्तन को एक औचित्य की आवश्यकता है, और "पुराना बुरा है" कोड परिवर्तन का औचित्य नहीं है।

भाषा परिवर्तन को तोड़ना एक बहुत ही मजबूत औचित्य की आवश्यकता है। भाषा को थोड़ा सरल बनाना कभी भी एक ब्रेकिंग बदलाव का औचित्य नहीं है।

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

तो, वास्तव में, यह एक दुखद कहानी है। इसके व्यावहारिक परिणामों के कारण नहीं: इसके बिल्कुल शून्य व्यावहारिक परिणाम थे। लेकिन क्योंकि यह आईएसओ समिति से सामान्य ज्ञान की स्पष्ट कमी को दर्शाता है।


5
जैसा कि आप स्वयं बताते हैं, इसे चित्रित करने का बिंदु इसका उपयोग करने को हतोत्साहित करना है। फिर भी आप कोई तर्क नहीं देते हैं कि इसके उपयोग को हतोत्साहित करना गलत है। मैं निश्चित रूप से आशा करता हूं कि अनाम नामस्थान पर नाम स्थान-स्कोप किए गए स्थिर घोषणाओं का उपयोग करने के लिए लोगों को प्रोत्साहित करने के लिए कोई भी बाहर नहीं है। तब तक नहीं जब तक कि उन्हें विशेष रूप से सी-कंपाइल करने की आवश्यकता न हो
निकोल बोलस

2
मुझे इस बात की कोई परवाह नहीं है कि वैश्विक दायरे staticया अनाम नाम स्थान का उपयोग करने वाले लोगों के बारे में , मैं या तो प्रोत्साहित या हतोत्साहित नहीं कर रहा हूं। मेरा कहना यह है कि यदि आप वास्तव में लोगों को गुमनाम नाम स्थान का उपयोग करने के लिए हतोत्साहित करना चाहते हैं तो आपको उन्हें अच्छे तर्क देने होंगे। व्यवहार में, मेरा मानना ​​है कि ज्यादातर कार्यान्वयन संस्थाओं में एक अनाम नामस्थान में घोषित किए गए प्रतीक एक यादृच्छिक नाम के साथ निर्यात किए गए प्रतीक हैं, इस प्रकार निर्यात तालिका बढ़ती है। staticOTOH के रूप में घोषित एंटिटीज को किसी भी तरह से निर्यात नहीं किया जाता है। इस प्रकार कई लोग चुनते हैं, उस अवलोकन के आधार पर, उपयोग करने के लिए static
curiousguy

2
" जैसा कि आप स्वयं बताते हैं, इसे चित्रित करने का बिंदु इसका उपयोग करने को हतोत्साहित करना है। " इसके उपयोग को हतोत्साहित करने का विषय यह है कि यह किसी दिन गायब हो सकता है। मेरा कहना है कि नेमस्पेस-स्कोप staticकभी भी गायब नहीं होगा, इसलिए इसे अपदस्थ करना गलत है। " फिर भी आप कोई तर्क नहीं देते हैं कि इसके उपयोग को हतोत्साहित करना गलत है। " मैंने कोई ठोस तर्क नहीं देखा है जो बताता है कि नेमस्पेस-स्कोप staticका उपयोग "गलत" है। केवल इसका उपयोग हतोत्साहित करने के लिए इसे गलत कहना गलत है, क्योंकि कोई भी वास्तव में विश्वास नहीं करता है कि यह गायब हो रहा है, और क्योंकि यह लोगों को विश्वास नहीं दिलाता है कि इसका उपयोग करना "गलत" है।
जिज्ञासु

5
पूरी भाषा "किसी दिन गायब हो जाएगी"। चलो C ++ को अपदस्थ करें।
लाइटनेस दौड़

2
"एक समान नस में, मैं सी-स्टाइल कास्ट्स को डबल से स्टेटिक_कास्ट <डबल> में बदलने जा रहा हूं, सिर्फ इसलिए कि" सी-स्टाइल कास्ट खराब हैं ", क्योंकि स्टैटिक_कास्ट <डबल> शून्य जानकारी और शून्य सुरक्षा जोड़ता है।" कई सॉफ्टवेयर इंजीनियरों के साथ मेरी शाश्वत लड़ाई है जो सी शैली की जातियों के मेरे उदार उपयोग के बारे में एक आदिम से दूसरे तक शिकायत करते रहते हैं।
माकोगन

14

हटाए गए या नहीं, इस भाषा की सुविधा को हटाने से मौजूदा कोड और लोगों को परेशान किया जाएगा।

संपूर्ण स्थैतिक पदावनति की बात सिर्फ इच्छाधारी सोच के साथ थी "अनाम नामस्थान स्थिर से बेहतर हैं" और "संदर्भ बेहतर संकेत हैं"। जबरदस्त हंसी।


1
"संदर्भ बेहतर संकेत हैं"? नहीं, स्मार्ट पॉइंटर्स स्मार्ट पॉइंटर्स हैं। आप हीप, इरेट, फ्री स्टोर से आवंटित मेमोरी के लिए संदर्भों का उपयोग नहीं कर सकते।
डैन ब्रेस्लाउ

3
क्षमा करें, मैं इसे एक विडंबनापूर्ण स्माइली के साथ समाप्त करना भूल गया।
मैक्सिम Egorushkin

2
@ डान: यह वही है जो यह उत्तर कहता है: "इच्छाधारी सोच" एक समान दोषपूर्ण सोच के साथ। वैश्यावृत्ति एक महत्वपूर्ण विशेषता है, जैसे कि वैश्विक-स्कोपिक-स्टैटिक है, हालांकि थोड़े अलग कारणों से, और भले ही वे प्रयोज्यता में कुछ ओवरलैप हैं।
फ्रेड नर्क

@ फ़्रेड, @ मैक्सिम: क्षमा करें यदि मुझे गलत समझा गया है, या यदि मेरी स्मृति दोषपूर्ण है। लेकिन मैं "संदर्भ बेहतर संकेत" को वर्गीकृत नहीं करता हूं "इच्छाधारी सोच के मामले के रूप में" अनाम नामस्थान स्थिर से बेहतर हैं "। मैं बाद की छड़ी बनाने के प्रयास से अच्छी तरह से वाकिफ हूं, लेकिन मुझे याद नहीं कि किसी ने गंभीर प्रस्ताव को संदर्भों के साथ बदलने का प्रस्ताव दिया है। फिर, शायद यह मेरी अपनी जागरूकता है जिसकी कमी है।
डैन ब्रेस्लाउ

1
@DanBreslau: char* foo = new char; char& ref = *foo;सिर्फ इसलिए कि आपको एक पॉइंटर दिया गया है जो शुरू में संदर्भों का उपयोग करने की आपकी क्षमता के बारे में कुछ नहीं कहता है।
को ऑर्बिट में
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.