এক্সকোডে অবহেলিত সতর্কতাগুলি দমন করা


133

সমস্ত এসডিকে চারদিকে ভাসমান অবস্থায়, একাধিক এসডিকে এবং প্ল্যাটফর্মগুলির জন্য তৈরি করা সহজ y যাইহোক, ৩.২ থেকে ৩.০ এবং এমনকি মাঝে মাঝে ২.x পর্যন্ত স্থির হয়ে, আমি প্রায়শই পরিবর্তিত বা বাতিল হওয়া পদ্ধতিগুলির সাথে জড়িত সতর্কতাগুলি পাই:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

যেহেতু আমি এখনও পুরানো ওএসের সাথে সামঞ্জস্য বজায় রাখতে চাই এবং আমি যখন বিল্ডিংয়ের সময় 'শব্দ' অপসারণ করার চেষ্টা করছি, তখন এই সতর্কতাগুলি বন্ধ বা অক্ষম করার কোনও উপায় আছে কি?


4
পল আর এর উত্তরটি কাজ করার সময়, বিবেচনা করুন যে ম্যানিকেশার খানিকটা বেশি শল্যচিকিত্সা, যাতে এটি আপনাকে গুরুত্বপূর্ণ সতর্কতাগুলি গুরুত্বপূর্ণ হতে পারে যা হারানো ছাড়াই আপনি যে ঠিক সতর্কতাটি চান তা দমন করতে দেয়। আমার কাছে মনে হয়, সেরা-অনুশীলনের দিক থেকে ম্যানিকেশারের সঠিক উত্তর ™
অলি

উত্তর:


82

-Wno-deprecated-declarationsএক্সকোডে বা তার সম্পর্কিত সেটিংস চেষ্টা করুন , GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(প্রো টিপ: এই সতর্কতার জন্য নির্দিষ্ট সেটিংসটি সন্ধান করতে বিল্ড সেটিংসে কেবল "অবচয়" টাইপ করুন)।

এক্সকোডের বর্তমান সংস্করণগুলি (যেমন এক্সকোড 9.2):

এখানে চিত্র বর্ণনা লিখুন


Xcode এর প্রাচীন সংস্করণগুলি (যেমন Xcode 2.x, 3.x):

এখানে চিত্র বর্ণনা লিখুন


17
দেখা যাচ্ছে এটি এর চেয়ে আরও সহজ; এক্সকোড লক্ষ্য সেটিংসে একটি চেকবক্স রয়েছে; আপনার উত্তর আমাকে সেখানে সন্ধান করতে উত্সাহিত করেছিল। ধন্যবাদ!
বেন গটলিয়েব

4
আপনি প্রতি ফাইলের ভিত্তিতে এটিও করতে পারেন। : প্রতি ফাইল পতাকা যোগ করার জন্য এই উত্তরটি দেখুন stackoverflow.com/a/6658549/272473
mrwalker

4
এই জাতীয় উত্তর নতুনদের জন্য হতাশাব্যঞ্জক। কোথায় চেষ্টা কর? আমি কীভাবে টার্গেট সেটিংস পাই? আরও কিছুটা ব্যাখ্যা করলে এই উত্তরের মান বাড়বে।
noogrub

8
এই উত্তরটির খারাপভাবে ব্যাখ্যা করা একটি উত্তর সঠিক হিসাবে চিহ্নিত করা উচিত নয়।
ক্রিস হ্যাটন

6
বিল্ড সেটিংসে "হ্রাস করা" অনুসন্ধান করুন এবং আপনি এটি দেখতে পাবেন।
কোয়ান্টাম্পোটাটো

337

যেহেতু আমি এখনও @ সামিক পোস্টে কোনও মন্তব্য যুক্ত করতে পারি না, তাই আমি মনে করি এটি আরও প্রসারিত করব। ইনপুট কোনও ফাংশন / পদ্ধতির আগে নির্দেশকে উল্লেখ করেছে যাতে আপনি অবহেলিত স্টাফ ব্যবহার করেন। তারপরে আপনি ফাংশন শেষের সংজ্ঞার পরে পূর্ববর্তী সেটিংসটি পুনরুদ্ধার করতে পারেন:

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

1
অসাধারণ! এটি আমি +1 :) সন্ধান করছিলাম
জোরাণ সিমিক

1
দুর্দান্ত টিপ! খুব খারাপ এটি কোনও পদ্ধতির অভ্যন্তরে ঘোষণা করা যায় না।
ডাস্টিন

12
আসলে এটি একটি পদ্ধতির অভ্যন্তরে ঘোষণা করা যেতে পারে। ডক্স / এসডিকে
এপ্রিলের

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
এলএলভিএম, জিসিসি এবং কলং কী তা নিয়ে আমি সবসময় বিভ্রান্ত হয়ে পড়ি। তাই, সময় বাঁচাতে আমি একটি নোট ফেলে দিতে চাইছিলাম। জিএনইউ কমপ্লায়ার কালেকশন (জিসিসি) এক্সকোড 3 এর সাথে ব্যবহার করা হয়েছিল, তারপরে অ্যাপল এক্সকোড 4কে হাইব্রিড এলএলভিএম-জিসিসি দিয়ে প্রকাশ করেছিল। তারপরে নিম্ন স্তরের ভার্চুয়াল মেশিন (এলএলভিএম) সংকলকটি দায়িত্ব নিয়েছে, আরও তথ্য llvm.orgদেখুন । এক্সকোড 7.2.1 হিসাবে ডিফল্ট সংকলক হ'ল অ্যাপল এলএলভিএম 7.0। এলএলভিএম সংকলক অন্যান্য "প্রকল্পগুলি", ডিবাগার এবং অন্যান্য সরঞ্জামগুলির একটি লাইব্রেরি, যার মধ্যে ক্ল্যাং নেটিভ সংকলক অন্তর্ভুক্ত রয়েছে। ঝনঝন একটি "এলএলভিএম নেটিভ" সি / সি ++ / অবজেক্টিভ-সি সংকলক।
সার্জ-কে

42

যেহেতু আমাদের পুরানো ওএসগুলিকে সমর্থন করার প্রয়োজন রয়েছে তবে আমাদের সতর্কতার প্রতি মনোযোগ দিন, আমি এটি করার একটি আরও সুষ্ঠু উপায় চাই। কিছু মজিলা কোড দ্বারা অনুপ্রাণিত হয়ে আমি এটি একসাথে রেখেছি:

#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;
);

এছাড়াও, যখন আপনি প্রি-আইওএস 7 ডিভাইসগুলির জন্য ড্রপ সমর্থন করেন, তখন আপনি সহজেই কোডের মাধ্যমে অনুসন্ধানের জন্য অবনমিত ব্যবহারগুলি স্থির করতে সন্ধান করতে পারেন।


গ্লোবাল / প্রকল্পের স্তরে অবচয় (বা অন্য কোনও) সতর্কবার্তা বন্ধ করার চেয়ে বেশিরভাগ কোডের জন্য এটি একটি দীর্ঘ দীর্ঘমেয়াদী সমাধান। ভয়ঙ্কর উত্তর।
নাটব্রো

1
do { ... } while(0);প্রয়োজনীয় কেন ?
বেন লেগিগিরো

1
@ বেনসি.আর. লেগিগেরো কারণ আপনি কোনও ব্লক পাস করছেন না কিন্তু সেই প্রথম বন্ধনীগুলির মধ্যে বেশ কয়েকটি বিবৃতি রয়েছে। আপনি মূলত প্রতিটি লাইনের জন্য সতর্কতা দমন করছেন।
আলেজান্দ্রো ইভান

1
@ আলেজান্দ্রোআইভান আমি জানি আপনার ব্যাখ্যাটি আপনার কাছে বোধগম্য হয়েছে ... তবে আমার কাছে মনে হচ্ছে আপনি প্রশ্নটি পুনরায় বাক্যটি দিয়ে যাচ্ছেন। আপনি do{...}while(0);এখানে ব্যাখ্যা করতে পারেন কেন বিশেষভাবে এখানে প্রয়োজনীয়? শুধু কেন নয় {...}? না কেন if(true){...}? ইত্যাদি
বেন লেগিগেরো

2
@ বেনসি.আর. লেজিগিয়োর আপনি ঠিক বলেছেন কোন কারণে আমি আপনার প্রশ্নটি ভুলভাবে পড়েছি। স্বীকৃত উত্তরটি এখানে দেখুন: stackoverflow.com/questions/154136/…
আলেজান্দ্রো ইভান

29

আপনি প্রতি ফাইল প্রতি সতর্কতা দমন করতে পারেন

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

যা পরিবর্তে একবারে এবং সমস্ত একসাথে সমস্ত সতর্কতা দমন করার চেয়ে খানিকটা ভাল অনুশীলন করে তোলে ... সর্বোপরি আপনি কীসের জন্য এটি করছেন তা জানতে পেরেছেন।


20

অবহেলিত পদ্ধতি প্রয়োগ করা বা অবহেলিত শ্রেণি প্রয়োগ করা যদি আপনি সতর্কবার্তাটি নীরব করতে চান তবে ব্যবহার করুন:

    # প্রগমা ক্ল্যাং ডায়াগনস্টিক পুশ
    #pragma ক্ল্যাং ডায়াগোনস্টিক উপেক্ষা "-বিহীন-বাস্তবায়ন"
    // কোড
    # প্রগমা ঝনঝন ডায়গনিস্টিক পপ


আমি যখন "-Wdeprecated-Declations" দেখেছি তখন আমার ধারণা "" -drecated-বাস্তবায়ন "থাকতে হবে। এবং এটি সত্যিই কাজ করে। ধন্যবাদ.
ডনসং

8

আপনার বিল্ড সেটিংসে, সন্ধান করুন Deprecated Functions

এখানে চিত্র বর্ণনা লিখুন


এটি সমস্ত "অবজ্ঞাত" সতর্কতা বন্ধ করে দেবে, তবে, কেবলমাত্র কয়েকটি সতর্কতা দমন করা দরকার।
ডনসং

2

আপনি যদি কোনও টুকরো কোডে সমস্ত ধরণের অবচয়ের জন্য কম্বল চেক করতে চান। নীচের মত দয়া করে -বিশেষিত পতাকা ব্যবহার করুন :

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

-3

তৃতীয় পক্ষের শিরোনাম ফাইলটি থেকে সতর্কতা অক্ষম করতে, ফাইলের শীর্ষে নীচের লাইনটি যুক্ত করুন

#pragma clang system_header
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.