2010-06-11 12 views
40

मैं इस तरह एक सुपर वर्ग की है। सीपीपी फ़ाइल, मैं एक अभ्यास के रूप में इस त्रुटिबचें चेतावनी 'unreferenced औपचारिक पैरामीटर'

warning C4100: 'param' : unreferenced formal parameter 

मिलता है, हम त्रुटियों के रूप में चेतावनी का इलाज किया जाता। उपर्युक्त चेतावनी से कैसे बचें?

धन्यवाद।

+0

बूस्ट का उपयोग करें :: ignore_unused (param) http://stackoverflow.com/a/24310846/888576 –

उत्तर

71

C++ में आप सिर्फ यह कर सकते हैं एक पैरामीटर है कि आप एक नाम का उपयोग नहीं कर रहे हैं देने के लिए की जरूरत नहीं है:

void Child::Function(int) 
{ 
    //Do nothing 
} 

आप में घोषणा में पैरामीटर नाम रखने के लिए इच्छा हो सकती है दस्तावेज के माध्यम से हेडर फ़ाइल, हालांकि। खाली कथन (;) भी अनावश्यक है।

void Child::Function(int param) 
{ 
    (void)param; //Do nothing 
} 
+1

@ चार्ल्स..यदि फ़ंक्शन इनलाइन है, तो क्या ऐसा करना कानूनी है? 'कक्षा बाल: सार्वजनिक अभिभावक {सार्वजनिक: शून्य कार्य (int/* param */= 0, int param2 = 0) {std :: cout << param2 << std :: endl; }}; ' – bdhar

+0

आपका मतलब डिफ़ॉल्ट मान के साथ एक नामहीन पैरामीटर है। मैं 100% निश्चित नहीं हूं लेकिन मुझे लगता है कि यह कानूनी है। मुझे किसी भी कारण से नहीं पता कि किसी भी मामले में क्यों नहीं। –

+3

@bdhar: ध्यान दें कि पदानुक्रम के विभिन्न स्तरों पर डिफ़ॉल्ट पैरामीटर प्रदान करना खतरनाक है जब तक कि आपके डिफ़ॉल्ट मान मेल नहीं खाते। आपको जो समस्या मिल सकती है वह यह है कि एक ही फ़ंक्शन को दो संदर्भों से कॉल करना एक ही अंतिम ओवरराइडर को विभिन्न डिफ़ॉल्ट मानों के साथ कॉल करना समाप्त कर सकता है: 'struct base {virtual void f (int i = 0); }; संरचना व्युत्पन्न: आधार {वर्चुअल शून्य एफ (int i = 5); }; int मुख्य() {व्युत्पन्न डी; आधार और बी = डी; डीएफ()/* डी :: एफ (5) * /; b.f();/* डी :: एफ (0) * /} ' –

17

एक और तकनीक है कि आप उपयोग कर सकते हैं आप पैरामीटर नाम रखना चाहते हैं शून्य को कास्ट करने के लिए है।

हालांकि, कुछ परिदृश्यों में, आपको पैरामीटर नाम की आवश्यकता है, क्योंकि डीबग बिल्ड में आप ASSERT() पर कॉल कर रहे हैं, लेकिन खुदरा निर्माण पर यह nop है। उन परिदृश्यों के लिए वहाँ एक आसान मैक्रो (कम से कम कुलपति ++ :-) में) UNREFERENCED_PARAMETER(), जो इस तरह परिभाषित किया जाता है:

#define UNREFERENCED_PARAMETER(x) x 

ध्यान दें कि सरल डाली @R शमूएल Klatchko भी तैनात काम करता है, लेकिन मैं व्यक्तिगत रूप से यह अधिक जानकारी प्राप्त पठनीय अगर कोड स्पष्ट है कि यह एक अप्रतिबंधित पैरामीटर बनाम सरल अस्पष्ट कलाकार है।

+0

यह int जैसे अंतर्निहित प्रकारों के लिए ठीक है, लेकिन यदि पैरामीटर एक अपूर्ण प्रकार का संदर्भ है, तो इसे शून्य पर कास्टिंग करने के लिए उस प्रकार की पूर्ण परिभाषा की आवश्यकता होती है जहां पहले ऐसी कोई आवश्यकता नहीं हो सकती थी। – TheBeardyMan

+0

यह सी लैंगेज के लिए समाधान है, इतना उपयोगी है। – Bentoy13

+1

क्यूटी का Q_UNUSED मैक्रो इसका थोड़ा और अधिक फैंसी संस्करण है। –

8

@Charles बेली उल्लेख किया है, आप पैरामीटर नाम को छोड़ सकते हैं:

+1

मैक्रो के पीछे छिपाना एक अच्छा विचार है (आप सही हैं कि यह स्पष्ट है तो मेरा उदाहरण)। उस ने कहा, आपको शायद अपने मैक्रो में कास्ट जोड़ना चाहिए या आपको चेतावनी मिल सकती है (g ++ 4.2.1 पर, मुझे चेतावनी मिलती है: कथन का कोई प्रभाव नहीं है ') –

+0

आप गैर-डीबग बिल्ड के लिए एएसएसईआरटी (पैरा) को परिभाषित कर सकते हैं (शून्य) परम। आपका UNREFERENCED_PARAMETER सुझाव देता है कि इसका संदर्भ नहीं दिया गया है। लेकिन इसे संदर्भित किया जा सकता है - एएसएसईआरटी में। – harper

26

मैं एक मैक्रो का उपयोग करना पसंद करता हूं, क्योंकि यह न केवल मेरे इरादे को संकलक बताता है, बल्कि कोड के अन्य रखरखाव, और बाद में खोजने योग्य है।

तर्क नाम पर टिप्पणी करने की विधि कोड (या मुझे 6 महीने बाद) से अपरिचित लोगों द्वारा आसानी से याद किया जा सकता है।

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

void CFooBar::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    UNREFERENCED_PARAMETER(pNMHDR); 

वैकल्पिक रूप से:

void CFooBar::OnLvnItemchanged(NMHDR* /* pNMHDR */, LRESULT *pResult) 
{ 
    // Not using: pNMHDR 

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

WinNT में विंडोज एसडीके।एच UNREFERENCED_PARAMETER()DBG_UNREFERENCED_PARAMETER() और DBG_UNREFERENCED_LOCAL_VARIABLE() के साथ परिभाषित करता है। वे सभी एक ही चीज़ का मूल्यांकन करते हैं, लेकिन अंतर यह है कि जब आप प्रारंभ कर रहे हैं तो DBG_UNREFERENCED_PARAMETER() का उपयोग किया जाता है और कोड पूर्ण होने पर पैरामीटर का उपयोग करने की अपेक्षा करता है। जब आप सुनिश्चित हों कि आप पैरामीटर का कभी भी उपयोग नहीं करेंगे, तो UNREFERENCED_PARAMETER() संस्करण का उपयोग करें।

माइक्रोसॉफ्ट फाउंडेशन क्लासेस (एमएफसी) के पास समान UNUSED() और UNUSED_ALWAYS() मैक्रोज़ के साथ एक समान सम्मेलन है।

एक शैली चुनें और इसके साथ चिपके रहें। इस तरह बाद में आप अपने कोड में "DBG_UNREFERENCED_PARAMETER" खोज सकते हैं और उस तर्क के किसी भी उदाहरण को ढूंढ सकते हैं जहां आपने तर्क का उपयोग करने की अपेक्षा की थी, लेकिन नहीं। एक सतत शैली को अपनाने और आदत से इसका उपयोग करके, आप इसे और बाद में अपने लिए आसान बना देंगे।

+1

पैरामीटर नाम पर टिप्पणी करना मेरी राय में सबसे अच्छा अभ्यास है, और सबसे अधिक पढ़ने योग्य भी है। –

+1

@ डेविडकिर्बी यदि आप फ़ंक्शन के अंदर ifdef रखते हैं तो परिभाषित करने के आधार पर पैरामीटर का उपयोग करते हैं या नहीं, तो आप हमें टिप्पणी नहीं कर सकते हैं। –

+1

टिप्पणी आउट पैरामीटर एनएमएचडीआर */* पीएनएमएचडीआर */एनएमएचडीआर/* * पीएनएमएचडीआर */ऊपर नहीं होना चाहिए, जो एक बग है जो फ़ंक्शन हस्ताक्षर को बदलता है। अधिक आम तौर पर, प्रकार और स्टार के बीच एक जगह न रखें: एनएमएचडीआर * पीएनएमएचडीआर –

4

मैं एक मैक्रो का प्रयोग करेंगे unreferenced औपचारिक पैरामीटर चेतावनी को दबाने के लिए:

#define UNUSED(x) (&reinterpret_cast< const int& >(x)) 

यह निम्न लाभ हैं:

  • विपरीत #define अप्रयुक्त (एक्स) (शून्य) x, ऐसा नहीं पैरामीटर के प्रकार की पूर्ण परिभाषा की आवश्यकता को पेश नहीं किया जाना चाहिए जहां पहले ऐसी कोई आवश्यकता नहीं हो सकती थी।
  • #define UNUSED (x) & x के विपरीत, इसका उपयोग उन पैरामीटरों के साथ सुरक्षित रूप से किया जा सकता है जिनके प्रकार unary & ऑपरेटर ओवरलोड करते हैं।
2

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

#pragma warning(disable: 4100) 

आप कोड की सिर्फ एक ब्लॉक के लिए चेतावनी को कम करना चाहते हैं , साथ उस पर घेरा:

#pragma warning(push) 
#pragma warning(disable: 4100) 
void SomeCallbackOrOverride(int x, float y) { } 
#pragma warning(pop) 

पैरामीटर नाम बाहर छोड़ने के अभ्यास डिबगर कि आप आसानी से नाम से निरीक्षण नहीं कर सकते और न ही घड़ी (में जोड़ने में नकारात्मक पक्ष यह है कि अगर आप एक से अधिक है भ्रमित हो जाता है अप्रतिबंधित पैरामीटर), और जब किसी विधि का एक विशेष कार्यान्वयन पैरामीटर का उपयोग नहीं कर सकता है, तो इसके मूल्य को जानने से आप whi को समझने में मदद कर सकते हैं आप जिस प्रक्रिया में हैं, उसके चरण चरण, विशेष रूप से जब आपके पास संपूर्ण कॉल स्टैक नहीं है।