अनुवाद इकाई के केवल भाग के लिए जीसीसी चेतावनियों को चुनिंदा रूप से अक्षम करें?


85

इस MSVC प्रीप्रोसेसर कोड के बराबर निकटतम GCC क्या है?

#pragma warning( push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

हमारे पास आमतौर पर शामिल हेडर में कोड है जो हम एक विशिष्ट चेतावनी उत्पन्न नहीं करना चाहते हैं। हालाँकि हम ऐसी फाइलें चाहते हैं जिनमें उन हेडरों को शामिल करना है जो उस चेतावनी को उत्पन्न करना जारी रखें (यदि परियोजना में वह चेतावनी सक्षम है)।


यदि हेडर / usr / में शामिल हैं या आपके पास क्या है, तो आपने डिफ़ॉल्ट रूप से उनके लिए चेतावनी उत्पन्न नहीं की है।
स्पड 86

जवाबों:


95

यह संस्करण 4.6, या ट्रंक में जून 2010 के आसपास से जीसीसी में संभव है

यहाँ एक उदाहरण है:

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */

8
पुश और पॉप कार्यक्षमता को gcc 4.6 ( gcc.gnu.org/oniltocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html ) में जोड़ा गया था ।
डेव जोहान्सन

अगर आप दो बार पॉप करने जा रहे हैं तो आप शायद दो बार पुश करना चाहेंगे।
दान

2
@ दान: मैनुअल पढ़ें, और टिप्पणी करें। उदाहरण की उत्पत्ति पर ध्यान दें।
मैट जॉइनर

4.4.7 जैसे पुराने संस्करणों के लिए FYI आप अभी भी उपयोग कर सकते हैं, #pragma GCC diagnostic [error|warning|ignored]लेकिन popकार्यान्वित / समर्थित नहीं है।
ट्रेवर बॉयड स्मिथ

36

निकटतम बात है जीसीसी नैदानिक pragma , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"। यह जो आप चाहते हैं उसके बहुत करीब नहीं है, और विवरणों और विवरणों के लिए लिंक देखें।


1
क्या आप जानते हैं कि इस सुविधा को न जोड़ने का औचित्य क्या और कहाँ हो सकता है? (मैं इसे नहीं पा सका।) मुझे लगता है कि उपयोगी होने के लिए चेतावनी पुश-अक्षम-पॉप है।

1
मैं वास्तव में कल्पना नहीं करता कि "सुविधाओं को नहीं जोड़ना" जीसीसी के लिए इतना तर्क है कि किसी को भी काम करने वाले पैच को प्रस्तुत करने की अनुपस्थिति है।
अराजकता

14
ऐसा नहीं है कि कोई भी इस तरह के ठीक-ठाक चेतावनी चेतावनी नियंत्रण के लिए काम करने को तैयार नहीं है, या कोड जमा नहीं कर रहा है - मुझे एक बड़ी सिलिकॉन वैली कॉरपोरेशन का पता है, जो पहले से ही ऐसा कर चुकी है, और दूसरा जो किसी को भुगतान करने में प्रसन्न होता है इसे करने के लिए और कोड को स्ट्रीम में प्राप्त करें। बल्कि, उस व्यक्ति के साथ चर्चा के अनुसार, जो (gdb अनुरक्षकों में से एक के रूप में) इस सामान में प्लग किया गया है, gcc अनुरक्षकों के पास एक दर्शन है: "यदि कोई चेतावनी है, तो यह एक बग है, और आपको इसे ठीक करने की आवश्यकता है।" इसलिए (imo) यह एक धार्मिक तर्क है, और वे कोड को नियंत्रित करते हैं इसलिए वे जीत जाते हैं।
बॉब मर्फी

बॉब की टिप्पणी में जोड़ने के लिए, जीसीसी डेवलपर्स के #pragmaनिर्देश को नापसंद करने का इतिहास है , इसलिए जीसीसी-विशिष्ट कुछ भी संभवतः एक के रूप में लागू होने की अधिक संभावना है __attribute__((foo))
टॉम

10
new gcc (> = 4.4) #pragma GCC push_optionsतो आप केवल निदान से अधिक के बारे में समझ सकते हैं ... gcc.gnu.org/oniltocs/gcc/…
Spudd86

33

मैंने भी कुछ ऐसा ही किया है। तीसरे पक्ष के कोड के लिए, मैं बिल्कुल भी कोई चेतावनी नहीं देखना चाहता था। इसलिए, निर्दिष्ट करने के बजाय -I/path/to/libfoo/include, मैंने उपयोग किया -isystem /path/to/libfoo/include। यह संकलक उन हेडर फ़ाइलों को चेतावनी के उद्देश्य से "सिस्टम हेडर" के रूप में मानता है, और जब तक आप सक्षम नहीं होते -Wsystem-headers, तब तक आप अधिकतर सुरक्षित रहते हैं। मैंने अभी भी वहां से कुछ चेतावनियों को लीक होते देखा है, लेकिन यह ज्यादातर कबाड़ में कटौती करता है।

ध्यान दें कि यह केवल आपकी मदद करता है यदि आप शामिल-निर्देशिका द्वारा अपमानजनक कोड को अलग कर सकते हैं। यदि यह आपके स्वयं के प्रोजेक्ट का सबसेट है, या अन्य कोड के साथ इंटरमिक्स किया गया है, तो आप भाग्य से बाहर हैं।


1
महान टिप। यदि LLVM का उपयोग कर रहे हैं, तो "Apple LLVM कंपाइलर - भाषा" अनुभाग में "अन्य C फ्लैग" के तहत -isystem ध्वज जोड़ें।
नेस्टर

@ साझा करने के लिए धन्यवाद। मैं नहीं समझ सकता कि आपके समाधान का उपयोग कहां करना है। क्या आप थोड़ा और कह सकते हैं?
लोरेंजो B

1

यह मैट जॉइनर के उत्तर का विस्तार है ।

यदि आप अपने कोड में सभी प्रागमास नहीं चाहते हैं, तो आप _प्रगमा ऑपरेटर का उपयोग कर सकते हैं :

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_PUSH
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

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