2012-04-14 18 views
20

क्या किसी को भी किसी भी चेतावनी के बारे में पता है कि सी ++ कंपाइलर्स उस स्थिरता को लागू करने में सहायता प्रदान करते हैं? उदाहरण के लिए, किसी भी सी ++ विधि द्वारा उत्पादित चेतावनी रखना अच्छा लगेगा जिसमें गैर-कॉन्स्ट पैरामीटर होता है जिसे विधि के अंदर कभी संशोधित नहीं किया जाता है। मैं देखता हूं कि एक gnu कंपाइलर चेतावनी है जिसे -W सुझाव- विशेषता = const; हालांकि, जब मैं इस ध्वज का उपयोग करता हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि यह पहचाना नहीं गया है। कोई विचार क्यों?कॉन्स्ट शुद्धता चेतावनियां सी ++

+0

"स्थिरांक शुद्धता" नहीं है वास्तव में विधि तर्क या स्थानीय चर के साथ बहुत कुछ करना है। cppcheck क्लास विधियों पर शैली चेतावनियों को उत्सर्जित कर सकता है जो कि साथ ही साथ बनाया जा सकता है। –

+0

'-Wsuggest-विशेषता 'जीसीसी-विशिष्ट फ़ंक्शन विशेषताओं के बारे में है, न कि स्थिरता के बारे में। '__attribute __ ((कॉन्स))' कुछ हद तक 'constexpr' के समान है। – Philipp

उत्तर

6

मुझे नहीं लगता कि ऐसी चेतावनी मौजूद है, अधिकतर क्योंकि यह बेकार होगा। सिर्फ इसलिए कि कॉल के अंदर एक पैरामीटर संशोधित नहीं किया गया है, इसका मतलब यह नहीं है कि इसे इसके लिए const बनाया जाना चाहिए।

virtual फ़ंक्शंस के बारे में सोचें। शायद बेस क्लास के डिजाइनर, हालांकि बेस क्लास में पैरामीटर को संशोधित नहीं करते हैं, इसे एक विस्तारित कक्षा में छोड़ना चाहते हैं चाहे वह पैरामीटर संशोधित करें या नहीं।

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

+2

मैं तुम्हारा बिंदु देखता हूं; हालांकि, मुझे अभी भी लगता है कि यह एक चेतावनी के रूप में उपयोगी होगा (शायद एक त्रुटि नहीं)। इसके अलावा, ऐसा लगता है कि gnu कंपाइलर के लिए एक ध्वज है- Wsuggest-attribute = const; लेकिन मेरा जी ++ कंपाइलर इसे पहचान नहीं पाता है। – user809409

+0

कोई सुविधा नहीं है जिसे मैं कभी भी एक कंपाइलर पर चलाना छोड़ूंगा, लेकिन सुझावों की समीक्षा करने के लिए हर समय चालू करना अच्छा होगा। यदि आप जानते हैं कि कोई फ़ंक्शन एक चर को संशोधित नहीं करेगा, तो इसे बनाने के लिए यह एक अच्छा अभ्यास है क्योंकि यह कॉन्स्ट चर को पारित करने की अनुमति देता है। – Darinth

+0

[जंग] (https://www.rust-lang.org/en -US /) में यह सुविधा है (अनावश्यक 'mut'), और यह कुछ है जो मुझे सी ++ पर वापस आने से चूकता है और यह सुनिश्चित करने की कोशिश करता है कि डिफ़ॉल्ट रूप से एपीआई और स्थानीय चर अपरिवर्तनीय हैं। – phoenix

0

नहीं, दुर्भाग्य से ऐसी कोई चेतावनी नहीं है। यदि आप कॉन्स्ट घोषित पैरामीटर को बदलने का प्रयास करते हैं तो आपको बस त्रुटियां मिलती हैं। ऐसा इसलिए है क्योंकि const घोषणाएं गायब होने के कारण कोड की शुद्धता को नहीं बदलती हैं। लेकिन संकलक के लिए संभावित अनुकूलन खोजने के लिए दृढ़ता महत्वपूर्ण है और यह कोड की पठनीयता में सुधार करता है। यह पेशेवरता का मामला है। विशेष रूप से संदर्भों का उपयोग करते समय शुद्धता एक जरूरी है। I often refer to this.
ऑपरेटर (असाइनमेंट, रूपांतरण, ...) खेलने में आने पर संकलक स्वयं को गंभीरता से गंभीरता लेता है। यहां एक गायब const और संकलक ऑपरेटर का उपयोग करने से इंकार कर देता है क्योंकि यदि दिया गया पैरामीटर संभवतः संशोधित किया जा सकता है या नहीं तो यह एक बड़ा अंतर बनाता है।

5

सावधान, एक const पैरामीटर इस तरह:

void myFunc(int const param); 

नहीं इंटरफेस के हैं करता है। यह कार्यान्वयन फ़ंक्शन के स्थानीय दायरे से संबंधित है। वास्तव में, इस समारोह:

int inc(int const param) { return param+1; } 

घोषित किया जा सकता है के रूप में

int inc(int param); 

यह स्थिरांक शुद्धता प्रतिमान का उल्लंघन एक चर को संशोधित करने के अधिकार का दावा करने नहीं है, लेकिन वास्तव में ऐसा नहीं।

यदि आप const_cast के बारे में चिंतित हैं तो आप इसे पहले कोड में या grep के लिए अपने कोड बेस में उपयोग नहीं कर सकते हैं।

0

मुझे ऐसी चेतावनियों से अवगत नहीं है और मुझे लगता है कि उन्हें एक कंपाइलर में लागू करना कठिन होगा - यानी, वे इसे धीमा कर देंगे। हो सकता है कि कुछ स्थैतिक विश्लेषण टूल में ऐसी विशेषताएं हों (लेकिन मुझे उन लोगों के बारे में पता नहीं है)।

Wsuggest-attribute=const के अनुसार, यह एक अलग बात है। यह एक जीसीसी-विशिष्ट "फ़ंक्शन विशेषता const" का उपयोग करने का सुझाव देगा, जो मूल रूप से, गणितीय फ़ंक्शन है, केवल मान प्राप्त करता है (कोई पॉइंटर्स नहीं), किसी स्थिर/वैश्विक स्थिति को पढ़ या बदल नहीं रहा है और केवल एक मान (कोई पॉइंटर्स) नहीं लौटा रहा है ।आगे विवरण के लिए, यहाँ देखो: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

0
-Wsuggest-attribute=const 

इस विश्लेषण विकल्प

-fipa-pure-const 

जिस पर डिफ़ॉल्ट रूप से सक्षम की आवश्यकता है

-O 

और उच्च

संबंधित मुद्दे