2010-06-02 12 views
15

निम्न उदाहरण में: -Wshadow मुद्दा एक चेतावनी के साथजीसीसी -Wshadow बहुत सख्त है?

class A 
{ 
    public: 
    int len(); 
    void setLen(int len) { len_ = len; } // warning at this line 
    private: 
    int len_; 
}; 

जीसीसी:

main.cpp:4: warning: declaration of `len' shadows a member of `this' 

समारोह लेन और पूर्णांक लेन अलग प्रकार के हैं। चेतावनी क्यों?

अद्यतन

मैं देख रहा हूँ वहाँ एक विस्तृत cocensuse क्या "छाया" का मतलब है। और औपचारिक दृष्टिकोण से संकलक वास्तव में इसका अर्थ भी करता है।

हालांकि आईएमएचओ, ध्वज व्यावहारिक नहीं है। उदाहरण आमतौर पर इस्तेमाल किया सेटर/गेटर मुहावरा के लिए:

class A { 
    void prop(int prop); // setter 
    int prop() const;  // getter 

    int prop; 
}; 

यह अच्छा होगा अगर वहाँ एक चेतावनी झंडा कि मामले में चेतावनी जारी करेगा नहीं है, लेकिन इस मामले में चेतावनी देगा "पूर्णांक एक" पूर्णांक छुपाता है "हो जाएगा ए"।

जोड़ना-मेरी विरासत कोड मुद्दे पर चेतावनी कई चेतावनियां, जबकि समय-समय पर मुझे "छाया" समस्या के कारण कीड़े की खोज होती है।

मुझे कोई फर्क नहीं पड़ता कि इसे "-Wmuch_more_practical_and_interesting_shadow" या "-Wfoooooo" कहा जाएगा।

तो, अन्य जीसीसी चेतावनी ध्वज जो मैंने वर्णित किया है?

अद्यतन 2

इतना ही नहीं मुझे -Wshadow किसी भी तरह उपयोगी नहीं link text सोचता है। मैं अकेला नहीं हूं :) कम सख्त जांच अधिक उपयोगी हो सकती है।

+4

आपका "आमतौर पर इस्तेमाल किया जाने वाला मुहावरे" कानूनी कोड भी नहीं है। –

उत्तर

14

ऐसा लगता है कि यह जीसीसी के नए संस्करणों पर हल किया गया है।

From version 4.8 changelog:

The option -Wshadow no longer warns if a declaration shadows a function declaration, 
unless the former declares a function or pointer to function, because this is a common 
and valid case in real-world code. 

और यह इस विषय पर लिनुस टोर्वाल्ड के विचारों का संदर्भ: दुर्भाग्य से एम्बेडेड सिस्टम जहां मैं वर्तमान में काम कर रहा हूँ के नवीनतम संकलक अभी भी जीसीसी 4.6 पर आधारित है https://lkml.org/lkml/2006/11/28/253

+0

+1। हालांकि, इस निर्णय के लिए जीसीसी से! –

+5

वास्तव में जीसीसी 4.8.2 के रूप में इस मुद्दे के साथ -शशाडो अभी भी वहां है। यदि आप इस बगजिला मुद्दे के माध्यम से पढ़ते हैं: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57709 यह पुष्टि हुई है कि _member_ फ़ंक्शन जिन्हें फ़ंक्शन पैरामीटर के समान नाम दिया गया है, जैसा कि आपके उदाहरण में है, अभी भी उत्पन्न करते हैं छाया चेतावनी। जीसीसी 4.8 के अनुसार, केवल मुफ्त कार्यों में यह त्रुटि दबाने वाली है। ऐसा लगता है कि हमें जीसीसी 5.0 तक यह काम करने के लिए इंतजार करना है जिस तरह से आप उम्मीद करेंगे। – ScottG

15

तथ्य पैरामीटर सदस्य समारोह से एक अलग प्रकार का तथ्य यह है कि पैरामीटर छाया सदस्य समारोह को प्रभावित नहीं करता है।

आप इस बारे में एक चेतावनी होने के लिए नहीं क्यों उम्मीद करेंगे?

+0

जब वे परिवर्तनीय छिपाते हैं तो मैं मामलों में दिलचस्प हूं। यह संभावित रूप से एक बग है। लेकिन जब एक चर "छिपा" चर सिर्फ दिलचस्प नहीं है। – dimba

+4

@idimba: मैं असहमत हूं। एक चर सूचक में एक फ़ंक्शन पॉइंटर संग्रहीत किया जा सकता है। इसके अलावा एक चर के लिए 'ऑपरेटर()' परिभाषित किया जा सकता है ताकि इसे फ़ंक्शन की तरह बुलाया जा सके। – Troubadour

+7

यह दिलचस्प नहीं हो सकता है, लेकिन यह * छाया * है। और चेतावनी कहा जाता है - Wshadow, नहीं - दिलचस्प। तो मैं उम्मीद करता हूं कि जब कोई नाम दूसरे छिपाएगा, तब नहीं जब @idimba सोचता है कि कोड "दिलचस्प" है। – jalf

6

यह बॉक्स पर बिल्कुल ठीक कहता है। यह आपको छाया की चेतावनी देता है।

setLen समारोह के अंदर, दो प्रतीकों जो हिस्सा एक ही नाम के दायरे में हैं। len फ़ंक्शन पैरामीटर का नाम है, और फ़ंक्शन का नाम भी है।

एक छाया दूसरे का नाम, इसलिए जब आप len को संदर्भित कोड लिखते हैं, तो आपको परिणाम प्राप्त नहीं हो सकता है। चूंकि आपने संकलक से आपको प्रतीकों के बारे में चेतावनी देने के लिए कहा है, एक दूसरे के लिए छायांकन, यह वही है जो आपको इसके बारे में चेतावनी देता है।

9

मुझे समझ में नहीं आता कि आप केवल कुछ विशिष्ट प्रकार के छायांकन पर जोर क्यों देते हैं। छायांकन छाया हो रहा है, और इसके खतरे वही हैं, भले ही प्रकार अलग हों और भले ही एक चर एक समारोह को छाया दे, भले ही आपके मामले में। छायांकन का खतरा यह है कि कोड कुछ लेखक जो कुछ भी करना चाहता था उससे अलग कुछ कर सकता है।

यह, Btw, आसानी से, हो सकता है सी में के बाद से जब एक चर एक समारोह पीछा कर रहा है ++ दोनों के बीच भेद बहुत पतली की तुलना में यह पहली नजर में लग सकता है है।

उदाहरण के लिए, यहाँ एक चर एक समारोह

struct L { 
    void operator()(); 
}; 

struct A { 
    void len(); 

    A(L len) { 
    len(); 
    // Intended to call the member function. Instead got a call to the functor 
    } 
}; 

छाया और मुझे लगता है कि यह बहुत स्पष्ट है उसकी वजह से कोड कुछ लेखक यह करने के लिए इरादा नहीं था कर सकता पीछा।

2

हाँ, हम इस चेतावनी को केवल चेतावनी देने के लिए ट्यून कर सकते हैं जब छाया खतरनाक हो सकती है। उदाहरण के लिए शैडो के लिए

शून्य सेट (int क्या) .. पूर्णांक क्या() स्थिरांक ..

लेकिन स्थानीय चर shadowning के लिए और इसके बाद के संस्करण functor उदाहरण के लिए सचेत न करें।

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

मुझे यह छाया चेतावनी एक अच्छा विचार होने के लिए मिलती है, बहुत उपयोगी है, इसे पूरी तरह से सुरक्षित और स्पष्ट मामलों के बारे में चेतावनी देने के लिए थोड़ा और विचार चाहिए। उदाहरण के लिए मैं उपसर्ग या कुछ करने के लिए आवश्यक तर्कों के साथ रह सकता हूं, लेकिन मैं साफ और सरल नाम पसंद करता हूं।

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