क्या किसी को भी किसी भी चेतावनी के बारे में पता है कि सी ++ कंपाइलर्स उस स्थिरता को लागू करने में सहायता प्रदान करते हैं? उदाहरण के लिए, किसी भी सी ++ विधि द्वारा उत्पादित चेतावनी रखना अच्छा लगेगा जिसमें गैर-कॉन्स्ट पैरामीटर होता है जिसे विधि के अंदर कभी संशोधित नहीं किया जाता है। मैं देखता हूं कि एक gnu कंपाइलर चेतावनी है जिसे -W सुझाव- विशेषता = const; हालांकि, जब मैं इस ध्वज का उपयोग करता हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि यह पहचाना नहीं गया है। कोई विचार क्यों?कॉन्स्ट शुद्धता चेतावनियां सी ++
उत्तर
मुझे नहीं लगता कि ऐसी चेतावनी मौजूद है, अधिकतर क्योंकि यह बेकार होगा। सिर्फ इसलिए कि कॉल के अंदर एक पैरामीटर संशोधित नहीं किया गया है, इसका मतलब यह नहीं है कि इसे इसके लिए const
बनाया जाना चाहिए।
virtual
फ़ंक्शंस के बारे में सोचें। शायद बेस क्लास के डिजाइनर, हालांकि बेस क्लास में पैरामीटर को संशोधित नहीं करते हैं, इसे एक विस्तारित कक्षा में छोड़ना चाहते हैं चाहे वह पैरामीटर संशोधित करें या नहीं।
इसके अलावा, बड़े अनुप्रयोगों के बारे में सोचें, जहां इंटरफेस या एपीआई को संशोधित करना या जो भी बहुत खर्च हो। आपको अब पैरामीटर को संशोधित करने की आवश्यकता नहीं है, लेकिन भविष्य में ऐसा करने का इरादा है। आप इसे const
बनाने के लिए नहीं जा रहे हैं, और const
को हटाते समय भविष्य में एक पूर्ण पुनर्निर्माण और शायद जोखिम त्रुटियों को मजबूर करें।
मैं तुम्हारा बिंदु देखता हूं; हालांकि, मुझे अभी भी लगता है कि यह एक चेतावनी के रूप में उपयोगी होगा (शायद एक त्रुटि नहीं)। इसके अलावा, ऐसा लगता है कि gnu कंपाइलर के लिए एक ध्वज है- Wsuggest-attribute = const; लेकिन मेरा जी ++ कंपाइलर इसे पहचान नहीं पाता है। – user809409
कोई सुविधा नहीं है जिसे मैं कभी भी एक कंपाइलर पर चलाना छोड़ूंगा, लेकिन सुझावों की समीक्षा करने के लिए हर समय चालू करना अच्छा होगा। यदि आप जानते हैं कि कोई फ़ंक्शन एक चर को संशोधित नहीं करेगा, तो इसे बनाने के लिए यह एक अच्छा अभ्यास है क्योंकि यह कॉन्स्ट चर को पारित करने की अनुमति देता है। – Darinth
[जंग] (https://www.rust-lang.org/en -US /) में यह सुविधा है (अनावश्यक 'mut'), और यह कुछ है जो मुझे सी ++ पर वापस आने से चूकता है और यह सुनिश्चित करने की कोशिश करता है कि डिफ़ॉल्ट रूप से एपीआई और स्थानीय चर अपरिवर्तनीय हैं। – phoenix
नहीं, दुर्भाग्य से ऐसी कोई चेतावनी नहीं है। यदि आप कॉन्स्ट घोषित पैरामीटर को बदलने का प्रयास करते हैं तो आपको बस त्रुटियां मिलती हैं। ऐसा इसलिए है क्योंकि const
घोषणाएं गायब होने के कारण कोड की शुद्धता को नहीं बदलती हैं। लेकिन संकलक के लिए संभावित अनुकूलन खोजने के लिए दृढ़ता महत्वपूर्ण है और यह कोड की पठनीयता में सुधार करता है। यह पेशेवरता का मामला है। विशेष रूप से संदर्भों का उपयोग करते समय शुद्धता एक जरूरी है। I often refer to this.
ऑपरेटर (असाइनमेंट, रूपांतरण, ...) खेलने में आने पर संकलक स्वयं को गंभीरता से गंभीरता लेता है। यहां एक गायब const
और संकलक ऑपरेटर का उपयोग करने से इंकार कर देता है क्योंकि यदि दिया गया पैरामीटर संभवतः संशोधित किया जा सकता है या नहीं तो यह एक बड़ा अंतर बनाता है।
सावधान, एक const
पैरामीटर इस तरह:
void myFunc(int const param);
नहीं इंटरफेस के हैं करता है। यह कार्यान्वयन फ़ंक्शन के स्थानीय दायरे से संबंधित है। वास्तव में, इस समारोह:
int inc(int const param) { return param+1; }
घोषित किया जा सकता है के रूप में
int inc(int param);
यह स्थिरांक शुद्धता प्रतिमान का उल्लंघन एक चर को संशोधित करने के अधिकार का दावा करने नहीं है, लेकिन वास्तव में ऐसा नहीं।
यदि आप const_cast
के बारे में चिंतित हैं तो आप इसे पहले कोड में या grep
के लिए अपने कोड बेस में उपयोग नहीं कर सकते हैं।
मुझे ऐसी चेतावनियों से अवगत नहीं है और मुझे लगता है कि उन्हें एक कंपाइलर में लागू करना कठिन होगा - यानी, वे इसे धीमा कर देंगे। हो सकता है कि कुछ स्थैतिक विश्लेषण टूल में ऐसी विशेषताएं हों (लेकिन मुझे उन लोगों के बारे में पता नहीं है)।
Wsuggest-attribute=const
के अनुसार, यह एक अलग बात है। यह एक जीसीसी-विशिष्ट "फ़ंक्शन विशेषता const
" का उपयोग करने का सुझाव देगा, जो मूल रूप से, गणितीय फ़ंक्शन है, केवल मान प्राप्त करता है (कोई पॉइंटर्स नहीं), किसी स्थिर/वैश्विक स्थिति को पढ़ या बदल नहीं रहा है और केवल एक मान (कोई पॉइंटर्स) नहीं लौटा रहा है ।आगे विवरण के लिए, यहाँ देखो: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
-Wsuggest-attribute=const
इस विश्लेषण विकल्प
-fipa-pure-const
जिस पर डिफ़ॉल्ट रूप से सक्षम की आवश्यकता है
-O
और उच्च
- 1. कॉन्स्ट-शुद्धता एसटीडी कंटेनर
- 2. सी # में कॉन्स्ट-शुद्धता कैसे प्राप्त करें?
- 3. अस्थायी उदाहरणों के साथ कॉन्स्ट शुद्धता
- 4. सी ++ स्मार्ट पॉइंटर कॉन्स शुद्धता
- 5. सी ++ म्यूटेक्स और कॉन्स शुद्धता
- 6. सी ++ कॉन्स्ट पॉइंटर घोषणा
- 7. कॉन्स्ट और
- 8. मल्टी-कैरेक्टर निरंतर चेतावनियां
- 9. कक्षा के स्थिर सदस्य कार्यों के लिए "कॉन्स्ट-शुद्धता" की कोई अवधारणा क्यों नहीं है?
- 10. क्षैतिज शुद्धता
- 11. नेमस्पेस शुद्धता
- 12. शुद्धता/JVM
- 13. साइथन शुद्धता
- 14. सी/सी ++: कॉन्स्ट स्ट्रक्चर के भीतर पॉइंटर्स
- 15. कॉन्स्ट तरीकों
- 16. LibSVM की शुद्धता
- 17. कॉन्स्ट संदर्भ
- 18. चेतावनियां :: पर्ल
- 19. "शून्य * कॉन्स्ट" के बराबर "कॉन्स्ट एलपीवीओआईडी" है?
- 20. सी ++ के लिए विशिष्ट कॉन्स्ट-क्वालिटी क्यों है?
- 21. पायथन कोड शुद्धता की जांच
- 22. आर क्लस्टरिंग 'शुद्धता' मीट्रिक
- 23. CoreLocation शुद्धता संकट
- 24. मुझे कॉन्स शुद्धता पर बेचें
- 25. कॉन्स्ट सरणी
- 26. कॉन्स्ट वेक्टर
- 27. PHPDocumentor दिनांक समस्या चेतावनियां
- 28. पीएमडी - कोड विश्लेषक चेतावनियां
- 29. सी ++ अमूर्त बेस क्लास कन्स्ट्रक्टर/विनाशक - सामान्य शुद्धता
- 30. सी ++ में, कंपाइलर गैर-कॉन्स्ट फ़ंक्शन का चयन क्यों करता है जब कॉन्स्ट भी काम करेगा?
"स्थिरांक शुद्धता" नहीं है वास्तव में विधि तर्क या स्थानीय चर के साथ बहुत कुछ करना है। cppcheck क्लास विधियों पर शैली चेतावनियों को उत्सर्जित कर सकता है जो कि साथ ही साथ बनाया जा सकता है। –
'-Wsuggest-विशेषता 'जीसीसी-विशिष्ट फ़ंक्शन विशेषताओं के बारे में है, न कि स्थिरता के बारे में। '__attribute __ ((कॉन्स))' कुछ हद तक 'constexpr' के समान है। – Philipp