2009-06-08 8 views
79

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

#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. 

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

+0

हेडर/usr/शामिल है या क्या आपके पास जीसीसी डिफ़ॉल्ट रूप से उनके लिए चेतावनी उत्पन्न नहीं करता है करने के लिए स्थापित कर रहे हैं:

यहाँ एक उदाहरण है। – Spudd86

उत्तर

86

यह 4.612 के बाद possible in GCC या ट्रंक में जून 2010 के आसपास है।

#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 */ 
+6

पुश और पॉप कार्यक्षमता जीसीसी 4.6 (http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html) में जोड़ा गया था। –

+0

यदि आप दो बार पॉप करने जा रहे हैं तो शायद आप दो बार धक्का देना चाहेंगे। – Dan

+1

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

34

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

+1

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

+1

मुझे सच में कल्पना नहीं है कि जीसीसी में "सुविधाओं को जोड़ने नहीं" एक कामकाजी पैच सबमिट करने वाले किसी की अनुपस्थिति के रूप में एक तर्क है। – chaos

+13

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

31

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

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

+1

सरल और प्रभावी, बहुत बहुत धन्यवाद! – GvS

+1

ग्रेट टिप। यदि एलएलवीएम का प्रयोग करते हैं, तो "ऐप्पल एलएलवीएम कंपाइलर - भाषा" खंड में "अन्य सी ध्वज" के तहत -इससिस्टम ध्वज जोड़ें। – Nestor

+0

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

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