एकल चेतावनी त्रुटि अक्षम करें


115

वहाँ दृश्य स्टूडियो के साथ एक सीपीपी फ़ाइल में सिर्फ एक चेतावनी लाइन को निष्क्रिय करने का एक तरीका है?

उदाहरण के लिए, यदि मैं एक अपवाद को पकड़ता हूं और इसे संभालता नहीं हूं, तो मुझे त्रुटि 4101 (अपरिचित स्थानीय चर) मिलती है। क्या उस फ़ंक्शन में इसे अनदेखा करने का एक तरीका है, लेकिन अन्यथा इसे संकलन इकाई में रिपोर्ट करें? फिलहाल, मैं #pragma warning (disable : 4101)फ़ाइल के शीर्ष पर रखता हूं , लेकिन यह स्पष्ट रूप से पूरी इकाई के लिए बंद हो जाता है।


19
यदि आप केवल प्रकार का उल्लेख करते हैं और अपवाद का नाम नहीं देते हैं, तो कोई चेतावनी नहीं होगी। जैसे catch (const std::exception& /* unnamed */) {.... }। यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन आपकी समस्या को हल कर सकता है।
सॉज़र्ड

जवाबों:


182
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

1
@ कूकी: हाँ, यह कोड के किसी भी टुकड़े के लिए काम करता है जो संकलक के माध्यम से जाता है।
मटेयो इटालिया

अधिक हाल के लिए, संक्षिप्त उत्तर, नीचे डैनियल Seither का जवाब देखें।
दान निसानबाम

4
clangइस pragma समर्थन करने के लिए प्रतीत नहीं होता है, लेकिन आप के साथ एक ही प्रभाव को प्राप्त कर सकते हैं #pragma clang diagnostic push, #pragma clang diagnostic ignored "-Wunused-variable"और #pragma clang diagnostic popक्लैग यूजर नियमावली में "कंट्रोल्सिंग डायग्नोस्टिकिक्स वाया प्रैग्मस"
प्रांगण

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

Visual Studio के लिए, कमांड लाइन तर्क है /wd4101। ध्यान दें :कि ध्वज और संख्या के बीच सामान्य नहीं है , और आप संख्याओं की अल्पविराम से अलग की गई सूची नहीं कर सकते। अन्य संकलक के लिए इसके बजाय हो सकता है /nowarn:4101
जेसी चिशोल्म

89

यदि आप केवल कोड की एक पंक्ति में चेतावनी को दबाना चाहते हैं, तो आप suppress चेतावनी निर्दिष्टक का उपयोग कर सकते हैं :

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

कोड की एकल पंक्ति के लिए, यह निम्नलिखित लिखने के समान है:

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

8
बहुत उपयोगी! दुर्भाग्य से, यह एक पंक्ति के लिए काम नहीं करता है जिसमें एक हेडर शामिल है जो चेतावनी उत्पन्न करता है।
मार्को पोपोविक

2
@MarkoPopovic: कोड के suppressएकल, पूर्व-संसाधित लाइन पर निर्दिष्ट होता है । यदि निम्न पंक्ति #pragma warning(suppress: ...)एक #includeनिर्देश है (जो अपने पैरामीटर द्वारा संदर्भित फ़ाइल को वर्तमान संकलन इकाई में विस्तारित करता है), तो प्रभाव केवल उस फ़ाइल की पहली पंक्ति पर लागू होता है। यह स्पष्ट होना चाहिए, क्योंकि संकलक द्वारा चेतावनी उत्पन्न की जाती है। संकलक पूर्व-संसाधित कोड पर संचालित होता है।
IInspectable

@IInspectable उस स्थिति में मैं इसे कोड की पोस्ट-प्रोसेस्ड लाइन कहूंगा । पूर्व-संसाधित का मतलब है कि यह प्रीप्रोसेसर द्वारा अभी तक अनुवादित नहीं किया गया है।
void.pointer 16

2
@voi: "-ed" समाप्त होने से पिछले कृदंत का संकेत मिलता है । यह व्यक्त करने के लिए उपयोग किया जाता है, कि कुछ अतीत में समाप्त हो गया है। एक "पूर्व संसाधित" रेखा एक लाइन है कि पूरी तरह से संसाधित किया गया है।
IInspectable

29

#pragma पुश / पॉप अक्सर इस तरह की समस्याओं के लिए एक समाधान होते हैं, लेकिन इस मामले में आप अपरिचित चर को क्यों नहीं हटाते हैं?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

6
यह सवाल का जवाब नहीं है। दी, यह ओपी की समस्या को हल कर सकता है, लेकिन भविष्य के पाठकों को एक simular सवाल के साथ मदद नहीं करेगा: "मैं अपने कोड के एक विशिष्ट भाग के लिए एक विशिष्ट चेतावनी कैसे बंद कर सकता हूं?"
सोजेरड

1
@Sjoerd: तीन लोगों ने पहले से ही "आधिकारिक प्रश्न" का उत्तर दिया, जो अन्य लोग खोज सकते हैं, इसलिए इसके बजाय मैंने लाइनों के बीच पढ़ने और उसकी वास्तविक समस्या को हल करने की कोशिश की (आपकी टिप्पणी के एक मिनट बाद :P)।
मट्टियो इटालिया

11
एक भविष्य के पाठक के रूप में @Sererd मैं इस तथ्य का जवाब देता हूं कि इससे मुझे मदद मिली।
मोलॉट

2
@ Mołot: एक पिछले लेखक के रूप में, मुझे खुशी है कि इसने मदद की। =)
मैट्टो इटालिया

9

उपयोग करें #pragma warning ( push ), फिर #pragma warning ( disable ), अपना कोड डालें, फिर यहां#pragma warning ( pop ) बताए अनुसार उपयोग करें :

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 

8

उदाहरण:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

यह प्रगामा विजुअल स्टूडियो 2005 के साथ शुरू होने वाले C ++ के लिए मान्य है ।
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

विजुअल स्टूडियो 2015 के माध्यम से विजुअल स्टूडियो 2005 के माध्यम से प्रगामा सी # के लिए मान्य नहीं है ।
त्रुटि: "अपेक्षित अक्षम या पुनर्स्थापित"।
(मुझे लगता है कि उन्हें लागू करने के लिए कभी नहीं मिला suppress...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

C # को एक अलग प्रारूप की आवश्यकता है। यह इस तरह दिखेगा (लेकिन काम नहीं):

#pragma warning suppress 0642  // (suppress one error in the next line)

इसके बजाय suppress, आपको disableऔर enable:

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

यह SO बदसूरत है, मुझे लगता है कि यह सिर्फ फिर से शैली के लिए समझदार है:

if (condition)
{
    // Do nothing (because blah blah blah).
}
else

5

फ़ाइल (या यहां तक कि एक हेडर फाइल) के शीर्ष पर डालने के बजाय, बस में विचाराधीन कोड लपेट #pragma warning (push), #pragma warning (disable)और मेल खाता हुआ #pragma warning (pop), के रूप में दिखाया यहाँ

हालांकि कुछ अन्य विकल्प भी हैं, जिनमें शामिल हैं #pramga warning (once)


5

एक भी UNREFERENCED_PARAMETERपरिभाषित में उपयोग कर सकते हैं WinNT.H। परिभाषा सिर्फ यह है:

#define UNREFERENCED_PARAMETER(P)          (P)

और इसका उपयोग करें:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

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

कुछ स्थिर कोड विश्लेषण अभी भी इस गैर-निरर्थक बयान ( wParam;) के लिए चेतावनी दे सकते हैं । उस स्थिति में, आप डिबग बिल्ड में DBG_UNREFERENCED_PARAMETERसमान UNREFERENCED_PARAMETERहै P=Pऔर रिलीज़ बिल्ड में करता है।

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

1
ध्यान दें कि C ++ 11 के बाद से हमारे पास [[maybe_unused]]विशेषता है
मेटालैस्टर

2

अगर आप unreferenced local variableकुछ हेडर में राइट को डिसेबल करना चाहते हैं

template<class T>
void ignore (const T & ) {}

और उपयोग करें

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

2
एक फ़ंक्शन कॉल, बस चेतावनी को दबाने के लिए? आप इसके बजाय ऐसा क्यों नहीं करते हैं (void)unusedVar;:?
नवाज

@ नवाज़: मुझे लगता (void)unusedVar;?है कि सी ++ मानक अनुरूप नहीं है।
एलेक्सी मालिस्टोव

2
इसकी अभिव्यक्ति जिसका मूल्य कुछ भी नहीं है। C ++ में, आप भी कर सकते हैं static_cast<void>(unusedVar)
नवाज

2
@Nawaz। हर्ब सटर स्पष्टीकरण: जड़ी बूटी की दुकान.com
एलेक्सी मालिस्टोव

2
§5.2.9 / 4 कहते हैं, Any expression can be explicitly converted to type “cv void.” The expression value is discardedआप लिख सकते हैं जिसके अनुसार static_cast<void>(unusedVar)और static_cast<const void>(unusedVar)और static_cast<volatile void>(unusedVar)। सभी फॉर्म वैध हैं। मुझे आशा है कि यह आपके संदेह को स्पष्ट करता है।
नवाज

2

कुछ स्थितियों में आपके पास एक नामित पैरामीटर होना चाहिए , लेकिन आप इसे सीधे उपयोग नहीं करते हैं।
उदाहरण के लिए, मैं VS2010 पर इसमें भाग गया, जब 'ई' का उपयोग केवल एक decltypeबयान के अंदर किया जाता है , संकलक शिकायत करता है, लेकिन आपके पास नामित नाम होना चाहिए e

उपरोक्त सभी गैर- #pragmaसुझाव सभी को केवल एक बयान जोड़ने के लिए उबालते हैं:

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

1
अब (एमएस VS2015 संकलक में) यह C4702 अगम्य कोड का कारण बनता है
Cee McSharpface

2

जैसा कि @ क्रैम्पियन में उल्लेख किया गया है, यदि आप गुप्त gcc में हैं, तो चेतावनियाँ नाम से हैं, संख्या नहीं है, और आपको करने की आवश्यकता होगी:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

यह जानकारी यहाँ से आती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.