Xcode में डिप्रेस्ड चेतावनियों को दबाना


133

सभी SDKs के आस-पास तैरने के साथ, यह कई SDK और प्लेटफार्मों के लिए निर्माण करने में सक्षम है। हालांकि, 3.2 से 3.0 और यहां तक ​​कि कभी-कभी 2.x से उछलते हुए, मुझे बार-बार पदावनत की गई चेतावनियों को शामिल करना पड़ता है, जो बदल गई हैं या अलग हो गई हैं:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

चूंकि मैं अभी भी पुराने ओएस के साथ संगतता बनाए रखना चाहता हूं, और निर्माण करते समय 'शोर' को दूर करने का प्रयास कर रहा हूं, क्या इन चेतावनियों को बंद या अक्षम करने का कोई तरीका है?


4
जबकि पॉल आर का जवाब काम करता है, इस बात पर विचार करें कि मणिकेसर थोड़ा अधिक सर्जिकल है, इसमें यह आपको अन्य अतिरिक्त चेतावनियों को खोए बिना, वास्तव में आपको इच्छित चेतावनी को दबाने की अनुमति देता है, जो महत्वपूर्ण हो सकता है। यह मुझे लगता है कि, सर्वोत्तम प्रथाओं के संदर्भ में, मणिकासेर के पास सही उत्तर है
ओली

जवाबों:


82

कोशिश करें -Wno-deprecated-declarations, या Xcode में इसकी संबंधित सेटिंग, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(प्रो टिप: इस चेतावनी के लिए विशिष्ट सेटिंग खोजने के लिए बिल्ड सेटिंग्स में "पदावनत" टाइप करें)।

Xcode के वर्तमान संस्करण (जैसे Xcode 9.2):

यहाँ छवि विवरण दर्ज करें


Xcode के प्राचीन संस्करण (जैसे Xcode 2.x, 3.x):

यहाँ छवि विवरण दर्ज करें


17
पता चला कि यह उससे भी आसान है; Xcode लक्ष्य सेटिंग में एक चेकबॉक्स है; आपके उत्तर ने मुझे वहाँ खोज करने के लिए प्रेरित किया। धन्यवाद!
बेन गोटलिब

4
आप इसे प्रति-फ़ाइल के आधार पर भी कर सकते हैं। प्रति फ़ाइल झंडे जोड़ने के लिए यह उत्तर देखें: stackoverflow.com/a/6658549/272473
mrwalker

4
इस तरह जवाब newbs के लिए निराशा होती है। यह कहाँ की कोशिश करो? मैं लक्ष्य सेटिंग कैसे खोजूं? थोड़ा और स्पष्टीकरण इस उत्तर के मूल्य में वृद्धि करेगा।
Noogrub

8
इस खराब तरीके से समझाया गया उत्तर सही नहीं होना चाहिए।
क्रिस हैटन

6
निर्माण सेटिंग्स में "पदावनत" के लिए खोजें और आप इसे देखेंगे।
क्वांटम्पोटेटो

337

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

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma GCC diagnostic pop

1
अति उत्कृष्ट! यह वही है जो मैं +1 :) के लिए देख रहा था
ज़ोरान सिमिक

1
बहुत बढ़िया टिप! बहुत बुरा यह एक विधि के अंदर घोषित नहीं किया जा सकता है।
डस्टिन

12
दरअसल इसे एक तरीके के अंदर घोषित किया जा सकता है। मैं बस में डॉक्स / एसडीके एक बग के कारण आज यह करना ही था
jer

6
+1 एक थोड़ा बेहतर तरीका के साथ सिंटैक्स का उपयोग करने के लिए है #pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop इस प्रक्रिया में वापस जो कुछ भी स्थापित करने से पहले स्थापित किया गया था करने के लिए ले जाता है के रूप में .. [ gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
Niclas

3
सुझावों की बदली हुई
रिकॉर्डिंग

143

क्लैंग एक अच्छी सुविधा प्रदान करता है जो प्रारंभिक चेतावनी राज्य से स्वतंत्र @manicaesar पोस्ट में "पुनर्स्थापना" चरण बनाता है:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop

क्लैंग मैनुअल को उद्धृत करने के लिए :

जीसीसी की प्रज्ञा द्वारा प्रदान की गई कार्यक्षमता के अलावा, क्लैंग आपको वर्तमान चेतावनी स्थिति को धक्का देने और पॉप करने की अनुमति भी देता है। हेडर फ़ाइल को लिखते समय यह विशेष रूप से उपयोगी होता है, जिसे अन्य लोगों द्वारा संकलित किया जाएगा, क्योंकि आप नहीं जानते कि वे किस झंडे के साथ निर्माण करते हैं।


1
जीसीसी के हाल के संस्करण एक ही वाक्यविन्यास (जीसीसी के लिए विकल्प क्लैंग) का उपयोग करते हैं।
निकोलस

3
मैं हमेशा इस बात को लेकर उलझन में रहता हूं कि LLVM, GCC और Clang क्या है। इसलिए, मैं समय बचाने के लिए एक नोट छोड़ना चाहता था। GNU कॉम्प्लिएर कलेक्शन (GCC) का उपयोग Xcode 3 के साथ किया गया था, तब Apple ने Xcode 4 को हाइब्रिड LLVM-GCC के साथ जारी किया। फिर लो लेवल वर्चुअल मशीन (LLVM) कंपाइलर ने ले ली, llvm.org पर अधिक जानकारी देखें । Xcode 7.2.1 के रूप में डिफ़ॉल्ट कंपाइलर Apple LLVM 7.0 है। LLVM कंपाइलर अन्य "प्रोजेक्ट्स", डीबगर और अन्य टूल्स की लाइब्रेरी है, जिसमें क्लैंग देशी कंपाइलर शामिल हैं। क्लैंग एक "LLVM देशी" C / C ++ / ऑब्जेक्टिव-सी कंपाइलर है।
सर्ज-के

42

चूंकि हमें पुराने OSes का समर्थन करने की आवश्यकता है, लेकिन हमारी चेतावनियों पर ध्यान दें, मुझे ऐसा करने के लिए एक कठिन रास्ता चाहिए था। मैंने कुछ मोज़िला कोड से प्रेरित होकर इसे एक साथ रखा:

#define SILENCE_DEPRECATION(expr)                                   \
do {                                                                \
_Pragma("clang diagnostic push")                                    \
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")   \
expr;                                                               \
_Pragma("clang diagnostic pop")                                     \
} while(0)

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr)
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr)

यह आपको निम्नलिखित कार्य करने की अनुमति देता है:

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]);

यह कोड के ब्लॉक के साथ भी काम करता है:

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self];
    view.lineWidth = self.lineWidth;
    view.strokeColor = self.color;
);

इसके अलावा, जब आप पूर्व iOS 7 उपकरणों के लिए ड्रॉप सपोर्ट करते हैं, तो आप ठीक करने के लिए हटाए गए usages को खोजने के लिए कोड के माध्यम से आसानी से खोज सकते हैं।


यह एक वैश्विक / परियोजना के स्तर पर पदावनति (या किसी अन्य) चेतावनियों पर क्लैंपिंग की तुलना में अधिकांश कोड के लिए बहुत बेहतर दीर्घकालिक समाधान है। भयानक जवाब।
नटब्रोब

1
क्यों do { ... } while(0);आवश्यक है?
बेन लेगियरियो

1
@ BenC.R.Leggiero क्योंकि आप उन कोष्ठकों के बीच एक ब्लॉक नहीं बल्कि कई कथन पारित कर रहे हैं। आप मूल रूप से हर पंक्ति के लिए चेतावनी को दबा रहे हैं।
एलेजांद्रो इवान

1
@ AlejandroIván मुझे पता है कि आपका स्पष्टीकरण आपको समझ में आता है ... लेकिन मेरे लिए, ऐसा लगता है कि आप प्रश्न को फिर से शब्दों में बदल रहे हैं। क्या आप बता सकते हैं कि do{...}while(0);विशेष रूप से यहाँ क्यों आवश्यक है? सिर्फ क्यों नहीं {...}? क्यों नहीं if(true){...}? आदि
बेन लेगियरियो

2
@ BenC.R.Leggiero तुम सही हो। किसी कारण से मैंने आपके प्रश्न को गलत बताया। स्वीकृत उत्तर यहां देखें: stackoverflow.com/questions/154136/…
एलेजांद्रो इवान

29

आप उपयोग करके प्रति फ़ाइल चेतावनी भी दबा सकते हैं

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

जो बदले में इसे केवल एक बार और सभी चेतावनी को दबाने की तुलना में थोड़ा बेहतर अभ्यास करता है ... आखिरकार आपको पता चल गया कि आप इसके लिए क्या कर रहे हैं।


20

यदि आप वंचित विधि को लागू करने या पदावनत वर्ग को लागू करने के लिए चेतावनी देना चाहते हैं , तो उपयोग करें:

    #pragma क्लैंग डायग्नोस्टिक पुश
    #pragma क्लैंग डायग्नोस्टिक को अनदेखा "
    // कोड
    #pragma क्लैंग डायग्नोस्टिक पॉप


जब मैंने "-विकृत-घोषणाएँ" देखीं, तो मुझे लगता है कि "-वृद्धिकृत-कार्यान्वयन" होना चाहिए। और यह वास्तव में काम करता है। धन्यवाद।
डॉनसॉन्ग

8

अपनी बिल्ड सेटिंग्स में, खोजें Deprecated Functions

यहाँ छवि विवरण दर्ज करें


यह सभी "पदावनत" चेतावनियों को बंद कर देगा, हालांकि, केवल कुछ चेतावनियों को दबाने की जरूरत है।
डॉनसॉन्ग

2

यदि आप कोड के एक टुकड़े में सभी प्रकार के पदावनत के लिए एक कंबल जांच चाहते हैं। का उपयोग करें -Wdeprecated नीचे की तरह झंडा:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop

-3

तृतीय-पक्ष हेडर फ़ाइल से चेतावनी को अक्षम करने के लिए, फ़ाइल के शीर्ष पर निम्न पंक्ति जोड़ें

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