2012-11-19 22 views
22

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

यह सोचने की एक उचित रेखा है, और यह ओएस एक्स पर जीसीसी 4.2 (1) और क्लैंग 4.0 (2) के साथ-साथ उबंटू पर क्लैंग 3.0 (3) में लागू कार्यान्वयन में दिखाई देता है।

  • (1): i686-सेब के darwin11-LLVM-जी ++ - 4.2 (जीसीसी) 4.2.1 (5658 निर्माण पर एप्पल इंक के आधार) (LLVM निर्माण 2336.11.00)
  • (2): ऐप्पल क्लैंग संस्करण 4.0 (टैग/ऐप्पल/क्लैंग -421.0.57) (एलएलवीएम 3.1 एसवीएनएन पर आधारित)
  • (3): उबंटू क्लैंग संस्करण 3.0-6ubuntu3 (टैग/RELEASE_30/अंतिम) (एलएलवीएम 3.0 पर आधारित)

हालांकि

, जब मैं जीसीसी 4.6 के साथ deprecat के सभी आमंत्रण के लिए (4) Ubuntu पर, मैं पदावनत हो चेतावनी संकलन संदर्भ के स्वतंत्र रूप से एड फ़ंक्शन। क्या यह कार्यक्षमता में एक प्रतिगमन है? क्या अन्य व्यवहार प्राप्त करने के लिए मैं संकलक विकल्प का उपयोग कर सकता हूं?

  • (4): जी ++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

उदाहरण कार्यक्रम: जीसीसी 4.2 से

int __attribute__((deprecated)) a() { 
    return 10; 
} 

int __attribute__((deprecated)) b() { 
    return a() * 2; //< I want to get rid of warnings from this line 
} 

int main() { 
    return b(); //< I expect a warning on this line only 
} 

आउटपुट (हाँ, मुझे दो बार एक ही चेतावनी मिलती है। मुझे इसकी परवाह नहीं है, हालांकि):

main.cpp: In function ‘int main()’: 
main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5) 
main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5) 
जीसीसी 4.6 से

आउटपुट:

main.cpp: In function 'int b()': 
main.cpp:6:9: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations] 
main.cpp:6:11: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations] 
main.cpp: In function 'int main()': 
main.cpp:10:9: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations] 
main.cpp:10:11: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations] 

मैं कैसे जीसीसी 4.6 समझा सकते हैं कि यह मुझे जीसीसी 4.2 के रूप में ही उत्पादन देना चाहिए? जीसीसी 4.6 और उच्चतर में यह केवल काम करता है:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
int __attribute__((deprecated)) b() { 
    return a() * 2; //< I want to get rid of warnings from this line 
} 
#pragma GCC diagnostic pop 

नोट:

+0

यह पूरी तरह से संभव है कि यह कभी भी एफएसएफ जीसीसी के साथ काम नहीं करता है, कि 4.2 व्यवहार जो आप देख रहे हैं वह जीसीसी को एक ऐप्पल पैच है। क्या आपके पास एफएसएफ जीसीसी 4.2 जांचने के लिए कहीं भी स्थापित किया गया है? – hvd

+0

@ एचवीडी आप सही हैं। मैं उस परीक्षा को देखना चाहता हूं, लेकिन मेरे पास 4.2 हाथ नहीं है:/ –

उत्तर

11

जीसीसी 4.2 में जो व्यवहार आप देख रहे हैं वह जीसीसी को ऐप्पल-विशिष्ट पैच के कारण होता है। एफएसएफ जीसीसी 4.2.4 a के उपयोग के बारे में चेतावनी देता है।विशिष्ट बिट एप्पल जीसीसी कि FSF जीसीसी करता नहीं दे रहा है कि:

--- a/gcc/toplev.c 
+++ b/gcc/toplev.c 
@@ -902,6 +902,9 @@ warn_deprecated_use (tree node) 
    if (node == 0 || !warn_deprecated_decl) 
    return; 

+ if (current_function_decl && TREE_DEPRECATED (current_function_decl)) 
+ return; 
+ 
    if (DECL_P (node)) 
    { 
     expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node)); 

(GPLv2 के तहत या बाद में उपलब्ध है)

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

+0

साफ! यह एक बहुत अच्छा जवाब है। मुझे लगता है कि मैं इसे एक फीचर अनुरोध करने जा रहा हूं। आप diff कहाँ मिला? –

+0

एफएसएफ स्रोत डाउनलोड करें, ऐप्पल स्रोत डाउनलोड करें, दोनों तरफ से अनपैक करें, एक रिकर्सिव डिफ चलाएं, परिणामों में "बहिष्कृत" की खोज करें और उम्मीद है कि बहुत सारे परिणाम नहीं हैं :) – hvd

+0

हे, इसे मिला। मुझे इसके लिए समय निर्धारित करना होगा ... :) धन्यवाद! –

26

-Wno-deprecated सभी बहिष्कृत चेतावनी

+10

यह ओपी क्या नहीं पूछ रहा है। – OmnipotentEntity

+1

@ ओमनीपोटेंट एंटीटी, क्यों नहीं? आप विरासत कोड को '-वनो-बहिष्कृत' और बिना नए कोड के संकलित करते हैं। – Lol4t0

+4

आपका कथन निस्संदेह सच है, लेकिन यह * इतना नहीं * मैं क्या पूछ रहा हूं। मैं * करता हूं * बहिष्करण चेतावनियां जीसीसी 4.2 देता है। –

24

जीसीसी 4.6 जोड़ा नैदानिक ​​pragmas इस समस्या को हल करने में मदद मिलेगी कि निकाल देंगे। push और pop 4.6 एक्सटेंशन हैं। जीसीसी 4.5 के साथ, #pragma GCC diagnostic push और pop को अनदेखा कर दिया जाएगा (चेतावनियों के साथ)। #pragma GCC diagnostic ignored "-Wdeprecated-declarations" पर अनदेखा नहीं किया जाएगा - लेकिन अब यह फ़ाइल के अंत तक प्रभावशाली है।

+1

+1 - यह उन लोगों के लिए वास्तव में एक अच्छा समाधान है जो जीसीसी को पैच करने में सक्षम नहीं हैं या नहीं। – Riot

1

मुझे एक ही समस्या का सामना करना पड़ता है। समाधान है कि आया निम्नलिखित

typedef OLD_A_NOT_TO_BE_USED a __attribute__((deprecated)); 

int OLD_A_NOT_TO_BE_USED() { 
    return 10; 
} 

int __attribute__((deprecated)) b() { 
    return OLD_A_NOT_TO_BE_USED() * 2; //< I want to get rid of warnings from this line 
} 

int main() { 
    return b(); //< I expect a warning on this line only 
} 

तो मैं सिर्फ OLD_A_NOT_TO_BE_USED वर्ग में मेरी एक वर्ग का नाम बदलने के लिए है। मुझे केवल बी() पर चेतावनी मिलती है; और अगर कोई इसका उपयोग कर रहा था तो उन्हें अभी भी बहिष्कृत चेतावनी मिल जाएगी।

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

  • कोई संबंधित समस्या नहीं^_^