क्या Xcode में चेतावनी को दबाने का कोई तरीका है?


119

क्या Xcode में चेतावनी को दबाने का कोई तरीका है?

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


हां, कभी-कभी आपको किसी अप्रयुक्त चर (उसके अनुसार) के बारे में चेतावनी नहीं देने के लिए संकलक से कहने की आवश्यकता होती है, लेकिन वास्तव में आप इसका उपयोग कर सकते हैंBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesummersign

जवाबों:


145

प्रति फ़ाइल आधार पर चेतावनियों को अक्षम करने के लिए, Xcode 3 और llvm-gcc-4.2 का उपयोग करके आप उपयोग कर सकते हैं:

#pragma GCC diagnostic ignored "-Wwarning-flag"

जहाँ चेतावनी नाम कुछ gcc चेतावनी ध्वज है।

यह कमांड लाइन पर किसी भी चेतावनी झंडे को ओवरराइड करता है। हालांकि यह सभी चेतावनियों के साथ काम नहीं करता है। अपने CFLAGS में Add -fdiagnostics-show-option और आप देख सकते हैं कि उस चेतावनी को अक्षम करने के लिए आप किस ध्वज का उपयोग कर सकते हैं।


धन्यवाद ! वास्तव में मुझे क्या चाहिए!
मोसजी

28
चेतावनी कोड प्राप्त करने का आसान तरीका: लॉग नेविगेटर (कमांड + 7) पर जाएं, सबसे ऊपरी बिल्ड का चयन करें, लॉग का विस्तार करें (दाईं ओर 'बटन'), और नीचे स्क्रॉल करें।
नील एहार्द

1
देखभाल करने वालों के लिए, जीसीसी चेतावनी विकल्पों का एक शैक्षिक संदर्भ: gcc.gnu.org/oniltocs/gcc/Warning-Options.html
लेवी

2
ऐसा लगता है #pragma GCC diagnostic ignored "-Wwarning-flag"कि पहले ही हटा दिया गया है
एलनिनली

1
@allenlinli अभी भी वहाँ है, आपको बस gcc.gnu.org/oniltocs/gcc/Warning-Options.htmlwarning-flag में सूचीबद्ध चेतावनियों में से एक को बदलना होगा
Fonix

49

अप्रयुक्त चर चेतावनियों को दबाने का एक सरल तरीका है :

#pragma unused(varname)

संपादित करें: स्रोत: http://www.cocoadev.com/index.pl?XCodePragmas

अद्यतन: मैं एक नए समाधान के साथ आया, एक अधिक मजबूत

  1. प्रोजेक्ट खोलें> सक्रिय लक्ष्य संपादित करें> टैब बनाएँ।
  2. के तहत User-Defined: कुंजी खोजें (या बनाएं यदि आपको नहीं मिलती है) कुंजी: GCC_WARN_UNUSED_VARIABLEइसे सेट करें NO

EDIT-2 उदाहरण:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

संकलक के लिए अप्रयुक्त चर चेतावनी दिखाता है ok

उपाय:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

पुनश्च: आप अन्य चेतावनी भी सेट / रीसेट कर सकते हैं GCC_WARN_ABOUT_RETURN_TYPE:YES/NO


31
यहां तक ​​कि सरल भी चर घोषणा से पहले __unused है।
मार्क लियोनार्ड

@ मार्क-लियोनार्ड को एक अलग उत्तर होना चाहिए था, मैं दिनों से इसकी तलाश कर रहा था। मुझे हताशा से टिप्पणियों को पढ़ना शुरू करना पड़ा। धन्यवाद।
सोना

35

जीसीसी के लिए आप उपयोग कर सकते हैं

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

आप यहां जीसीसी प्रज्ञा के बारे में जान सकते हैं और चेतावनी का चेतावनी कोड प्राप्त करने के लिए रिपोर्ट नेविगेटर (कमांड + 9) पर जाएं, सबसे ऊपरी बिल्ड का चयन करें, लॉग का विस्तार करें (दाईं ओर 'बटन'), और स्क्रॉल करें नीचे और वहां आपका चेतावनी कोड इस तरह चौकोर कोष्ठक के भीतर है[-Wshadow-ivar]

क्लैंग के लिए आप उपयोग कर सकते हैं

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop

4
क्लैंग मौजूदा स्रोत कोड के साथ संगतता के लिए जीसीसी की प्रगति का समर्थन करता है। तो आपको बस gcc format pragma लिखना होगा।
एलन

1
Xcode 5.0 के साथ शुरू, Clang प्रदान किया गया एकमात्र संकलक था। तो आप अब क्लैग प्रारूप प्रागमा का उपयोग करने के लिए नेड कर सकते हैं
एलनिनली

27

एक व्यक्ति फ़ाइल के लिए चेतावनी देने के लिए निम्न कार्य करें:

फ़ाइल को xcode प्रोजेक्ट में चुनें। प्रेस जानकारी प्राप्त करें बिल्ड पेज के साथ दर्ज करें दर्ज करें-एक चेतावनी को नकारने के लिए -नहीं:

-Wno-

जैसे

-Wno-अप्रयुक्त पैरामीटर

आप चेतावनी का नाम प्राप्त कर सकते हैं यदि आप प्रोजेक्ट सेटिंग्स को देखते हैं तो बिल्ड टैब पृष्ठ के नीचे स्थित GCC चेतावनियों को देखें, प्रत्येक चेतावनी पर क्लिक करके यह आपको चेतावनी पैरामीटर नाम बताएगा:

जैसे

जब भी कोई फ़ंक्शन पैरामीटर अपनी घोषणा से अलग न हो तो चेतावनी दें। [GCC_WARN_UNUSED_PARAMETER, -Wunused-पैरामीटर]


2
यह एक उत्कृष्ट समाधान है जब आपने एक कोडबेस से कोड को शामिल किया है जिसे आप संशोधित नहीं करना चाहते हैं जो संकलक चेतावनी को ट्रिगर करता है ...
मार्क बीटन

एक शानदार तरीका लगता है, लेकिन किसी भी विचार आप XCode 4 में यह कैसे करते हैं
संतोष


अगर आपको मेरी तरह सिर्फ एक ही समस्या के लिए एक चेतावनी चेतावनी की जरूरत है: ...m:45:69: Incompatible pointer types sending...मैंने बिल्ड स्पष्टीकरण खोला और इस चेतावनी को पाया: [-Wincompatible-pointer-types]मैंने अभी इसका नाम बदल दिया -Wno-incompatible-pointer-typesऔर अपनी .mफ़ाइल में एक ध्वज के रूप में जोड़ा ... बूम कोई और चेतावनी ... +10 if i
निकोस कारालिस

5

ऑब्जेक्टिव-सी के साथ, कई गंभीर त्रुटियां केवल चेतावनी के रूप में दिखाई देती हैं। इतना ही नहीं मैं कभी भी चेतावनियों को अक्षम नहीं करता , मैं आम तौर पर "त्रुटियों के रूप में चेतावनी" (-वायरर) को चालू करता हूं।

आपके कोड में हर प्रकार की चेतावनी को सही तरीके से करने से बचा जा सकता है (सामान्य रूप से वस्तुओं को सही प्रकार से कास्टिंग करके) या जब आपको उनकी आवश्यकता हो तो प्रोटोटाइप की घोषणा करके।


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

5

चेतावनी से छुटकारा पाने के लिए: प्रश्न में ऑब्जेक्ट के लिए एक श्रेणी इंटरफ़ेस बनाने का प्रयास करें

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

एक तरफ के रूप में, मैं शिपिंग कोड में अनिर्दिष्ट तरीकों को कॉल करने के खिलाफ दृढ़ता से सलाह देता हूं । इंटरफ़ेस बदल सकता है और बदल जाएगा, और यह आपकी गलती होगी।


मैं भी यही करता हूं। मैं अपनी श्रेणी "निजी" कहता हूं और इसे .m फ़ाइल के शीर्ष पर रखता हूं ... यह उन तरीकों को अग्रेषित करने का एक तरीका है जो केवल फ़ाइल के भीतर उपयोग किए जाने वाले तरीकों की घोषणा करता है। मैं मानता हूं कि एक निजी हेडर फ़ाइल अधिक मानक होगी, लेकिन किसी चीज़ के लिए फ़ाइलों के बीच लगातार उछाल होना, जो वास्तव में पूर्ण रूप से निहित होना चाहिए (निजी) कार्यान्वयन के लिए कष्टप्रद है।
पाट नीमेयर

तो, यह पता चला है कि आप कुछ भी उपयोग करने से पहले विधि को लागू करने की पुरानी सी चाल का उपयोग कर सकते हैं। तब आप अपने आप को एक फ़ाइल-स्थानीय विधि प्राप्त कर चुके हैं। मुझे लगता है कि हालांकि यह निजी नहीं है, इसलिए अन्य फाइलें संभवतः चयनकर्ता को एक संदेश भेज सकती हैं जिसे आप इस तरह से परिभाषित करते हैं।
मार्क पौली


3

एक नई, अलग हेडर फ़ाइल बनाएं जिसे 'Undocumented.h' कहा जाता है और इसे अपने प्रोजेक्ट में जोड़ें। फिर प्रत्येक वर्ग के लिए एक इंटरफ़ेस ब्लॉक बनाएं, जिसे आप अनलिमेटेड फ़ंक्शंस पर कॉल करना चाहते हैं और प्रत्येक को 'अनडोज़िडेटेड' की श्रेणी देते हैं। फिर बस अपने पीसीएच में उस एक हेडर फ़ाइल को शामिल करें। इस तरह से आपकी मूल हेडर फाइलें साफ रहती हैं, जिसे बनाए रखने के लिए केवल एक अन्य फाइल है, और आप सभी चेतावनियों को फिर से सक्षम करने के लिए अपने पीसीएच में एक लाइन को टिप्पणी कर सकते हैं।

मैं इस पद्धति का उपयोग '' मूल्यह्रास '' की श्रेणी के साथ 'ह्रास' में ह्रास कार्यों के लिए भी करता हूँ।

सबसे अच्छी बात यह है कि आप व्यक्तिगत प्रोटोटाइप के बारे में टिप्पणी या असहज करने से व्यक्तिगत चेतावनियों को चुनिंदा रूप से सक्षम / अक्षम कर सकते हैं।


1

यह कहना कि विशेष चेतावनी सुरक्षित नहीं है। कंपाइलर को सही कोड जेनरेट करने के लिए तर्कों के प्रकार और विधि पर वापस जाने की जरूरत है।

उदाहरण के लिए, यदि आप इस तरह से एक विधि कह रहे हैं

[foo doSomethingWithFloat: 1.0];

यह एक फ्लोट लेता है, और कोई प्रोटोटाइप दिखाई नहीं देता है, तब कंपाइलर अनुमान लगाएगा कि विधि एक डबल लेती है, फ्लोट नहीं। इससे क्रैश और गलत व्याख्या किए गए मान हो सकते हैं। ऊपर के उदाहरण में, इंटेल मशीनों की तरह थोड़ा एंडियन मशीन पर, रिसीवर विधि 0 नहीं, 1 को पारित करेगी।

आप i386 ABI डॉक्स में क्यों पढ़ सकते हैं , या आप अपनी चेतावनी को ठीक कर सकते हैं। :-)


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