একক সতর্কতা ত্রুটি অক্ষম করুন


114

ভিজ্যুয়াল স্টুডিও সহ সিপিপি ফাইলে কেবলমাত্র একটি একক সতর্কতা লাইন অক্ষম করার কোনও উপায় আছে?

উদাহরণস্বরূপ, যদি আমি একটি ব্যতিক্রম ধরা পড়ে এবং এটি পরিচালনা না করি তবে আমি ত্রুটি 4101 পেয়েছি (স্থানীয় বিবেচনা ছাড়াই)। কেবলমাত্র সেই ফাংশনে এটিকে উপেক্ষা করার কোনও উপায় আছে তবে অন্যথায় এটি সংকলন ইউনিটে প্রতিবেদন করুন? এই মুহুর্তে, আমি #pragma warning (disable : 4101)ফাইলটির শীর্ষে রেখেছি , তবে এটি পুরো ইউনিটের জন্য কেবল এটি বন্ধ করে দিয়েছে।


19
যদি আপনি কেবল প্রকারটি উল্লেখ করেন এবং ব্যতিক্রমটির নাম না রাখেন তবে কোনও সতর্কতা থাকবে না। যেমন catch (const std::exception& /* unnamed */) {.... }। এটি আপনার প্রশ্নের উত্তর দেয় না, তবে আপনার সমস্যার সমাধান করতে পারে।
সুজেয়ার্ড

উত্তর:


180
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

1
@ কুকি: হ্যাঁ, এটি সংকলকটি যে কোনও কোডের জন্য কাজ করে।
মাত্তেও ইটালিয়া

আরও সাম্প্রতিক, সংক্ষিপ্ত উত্তরের জন্য নীচে নীচে ড্যানিয়েল সিয়ারের উত্তর দেখুন।
ড্যান নিসেনবাউম

4
clangএই pragma সমর্থন বলে মনে হচ্ছে না, কিন্তু আপনি সঙ্গে একই প্রভাব অর্জন করতে পারেন #pragma clang diagnostic push, #pragma clang diagnostic ignored "-Wunused-variable"এবং #pragma clang diagnostic popঝাঁকুনির ব্যবহারকারীর ম্যানুয়ালটিতে "ডায়াগনোসটিক্স ভায়া প্রাগমাস নিয়ন্ত্রণ"
রানপম্পান

যেহেতু আমি এই বৈশিষ্ট্যটি অভাবনীয়ভাবে ব্যবহার করি, যখন আমি এটি করি তখন আমি সাধারণত নিজেকে বাক্যবিন্যাসের স্মরণ করিয়ে দেওয়ার জন্য এই পৃষ্ঠায় সজ্জিত করি। আমি কেবল এটি একটি অবহেলিত ফাংশনটির কলকে ঘিরে রেখেছিলাম যা কখনই আপডেট না হয়ে যায়, যাতে সতর্কতা আমাকে সংবেদী তালিকার মধ্যে বিরক্ত না করে, যা আমি ধর্মীয়ভাবে স্ক্যান করি।
ডেভিড এ। গ্রে

ভিজ্যুয়াল স্টুডিওর জন্য, কমান্ড লাইন আর্গুমেন্ট /wd4101। নোট :করুন পতাকা এবং সংখ্যাটির মধ্যে স্বাভাবিক কিছু নেই এবং আপনি কমা দ্বারা পৃথক হওয়া সংখ্যার তালিকা করতে পারবেন না। অন্যান্য সংকলকগুলির জন্য এটি পরিবর্তে হতে পারে /nowarn:4101
জেসি

89

আপনি যদি কেবলমাত্র একক লাইনের কোডের মধ্যে একটি সতর্কতা দমন করতে চান তবে আপনি suppress সতর্কতা নির্দিষ্টকারকটি ব্যবহার করতে পারেন :

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

একক লাইন কোডের জন্য, এটি নিম্নলিখিত লেখার মতো কাজ করে:

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

8
খুব দরকারী! দুর্ভাগ্যক্রমে, এটি কোনও একক লাইনের জন্য কাজ করে না যাতে এতে শিরোনাম উত্পন্ন করে এমন একটি শিরোনাম রয়েছে।
মার্কো পপোভিচ

2
@ মারকোপোপোভিচ: suppressনির্দিষ্টকরণকারী কোডের একক, প্রাক-প্রক্রিয়াজাত লাইনে কাজ করে। নীচের লাইনটি #pragma warning(suppress: ...)যদি কোনও #includeনির্দেশিকা হয় (যা তার পরামিতি দ্বারা ফাইলটিকে বর্তমান সংকলন ইউনিটে প্রসারিত করে), প্রভাবটি কেবলমাত্র সেই ফাইলের প্রথম লাইনেই প্রযোজ্য। এটি সুস্পষ্ট হওয়া উচিত, যেহেতু সংকলক দ্বারা সতর্কতা উত্পন্ন হয়। সংকলক প্রাক-প্রক্রিয়াজাত কোডে পরিচালনা করে।
IInspectable

@Inspectable সেক্ষেত্রে আমি এটিকে একটি পোস্ট- প্রসেসড কোডের লাইন বলব। প্রাক প্রক্রিয়াজাতকরণ এর অর্থ এটি এখনও প্রিপ্রোসেসর দ্বারা অনুবাদ করা হয়নি।
void.pointer

2
@ ভোই: " -যুক্ত " সমাপ্তি অতীতের অংশগ্রহণকারীকে বোঝায় । এটি প্রকাশ করতে ব্যবহৃত হয়, যে কিছু অতীতে শেষ হয়েছিল। একটি "প্রাক-প্রক্রিয়াজাতকরণ" লাইনটি সম্পূর্ণরূপে প্রক্রিয়াভুক্ত হওয়া একটি লাইন।
IInspectable

29

#pragma এই ধরণের সমস্যার জন্য প্রায়শই পুশ / পপ সমাধান হয় তবে এই ক্ষেত্রে আপনি কেবল অননুমোদিত পরিবর্তনশীলটিকে সরিয়ে দেবেন না কেন?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

6
এটি প্রশ্নের উত্সাহ নয়। মঞ্জুর, এটি ওপির সমস্যা সমাধান করতে পারে তবে ভবিষ্যত পাঠকদের একটি একক প্রশ্নের সাহায্য করবে না: "আমি কীভাবে আমার কোডের একটি নির্দিষ্ট অংশের জন্য একটি নির্দিষ্ট সতর্কতাটি বন্ধ করব?"
সোজেয়ার্ড

1
@ সোজার্ড: তিন জন লোক ইতিমধ্যে "সরকারী প্রশ্নের" উত্তর দিয়েছেন যা অন্য লোকেরা অনুসন্ধান করতে পারে, সুতরাং আমি তার পরিবর্তে লাইনের মধ্যে পড়তে চেষ্টা করেছি এবং তার আসল সমস্যাটি সমাধান করার চেষ্টা করেছি (আপনার মন্তব্যের এক মিনিট পরে এসেছি :P)।
মাত্তেও ইটালিয়া

11
@ সুজার্ড ভবিষ্যতের পাঠক হিসাবে আমি সত্যতা দিয়েছি যে এই উত্তরটি আমাকে সত্যই সাহায্য করেছিল।
মোয়াট

2
@ মোউত: একজন অতীত লেখক হিসাবে আমি আনন্দিত যে এটি সাহায্য করেছে। =)
মাত্তেও ইটালিয়া

9

তারপরে আপনার কোডটি ব্যবহার করুন #pragma warning ( push ), তারপরে এখানে বর্ণিত হিসাবে #pragma warning ( disable )ব্যবহার করুন :#pragma warning ( pop )

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 

8

উদাহরণ:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

এই pragma জন্য বৈধ সি ++ ভিসুয়াল স্টুডিও 2005. দিয়ে শুরু
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

প্রগমা ভিজ্যুয়াল স্টুডিও 2015 এর মাধ্যমে ভিজ্যুয়াল স্টুডিও 2005 এর মাধ্যমে সি # এর পক্ষে বৈধ নয়
Error ত্রুটি: "প্রত্যাশিত অক্ষম বা পুনরুদ্ধার"।
(আমি অনুমান করি তারা কখনই বাস্তবায়ন করতে পারে নি suppress...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

সি # এর আলাদা ফর্ম্যাট দরকার। এটি দেখতে দেখতে (তবে কাজ করে না):

#pragma warning suppress 0642  // (suppress one error in the next line)

পরিবর্তে suppress, আপনাকে disableএবং enable:

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

এটি অত্যন্ত কুৎসিত, আমার মনে হয় এটি কেবল পুনরায় স্টাইল করা আরও স্মার্ট:

if (condition)
{
    // Do nothing (because blah blah blah).
}
else

5

ফাইল (বা এমনকি একটি হেডার ফাইল) উপরের তে এটি নির্বাণ পরিবর্তে, শুধু সঙ্গে প্রশ্নে কোড মোড়ানো #pragma warning (push), #pragma warning (disable)এবং একটি মানানসই #pragma warning (pop), হিসাবে দেখানো এখানে

যদিও এর সাথে আরও কিছু অপশন রয়েছে #pramga warning (once)


5

এক এছাড়াও UNREFERENCED_PARAMETERসংজ্ঞায়িত ব্যবহার করতে পারেন WinNT.H। সংজ্ঞাটি কেবল:

#define UNREFERENCED_PARAMETER(P)          (P)

এবং এটি ব্যবহার করুন:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

আপনি কেন এটি ব্যবহার করবেন, আপনি তর্ক করতে পারেন যে আপনি কেবল ভেরিয়েবলের নামটি বাদ দিতে পারেন। ঠিক আছে, এমন কেস রয়েছে (বিভিন্ন প্রকল্পের কনফিগারেশন, ডিবাগ / রিলিজ বিল্ডস) যেখানে ভেরিয়েবলটি সম্ভবত ব্যবহার করা যেতে পারে। অন্য কনফিগারেশনে ভেরিয়েবল অব্যবহৃত থাকে (এবং সেইজন্য সতর্কতা)।

কিছু স্থির কোড বিশ্লেষণ এখনও এই অ-সংবেদনশীল বিবৃতি ( wParam;) এর জন্য সতর্কতা দিতে পারে । সেক্ষেত্রে আপনি মেয়োজ করতে পারেন DBG_UNREFERENCED_PARAMETERযা UNREFERENCED_PARAMETERডিবাগ বিল্ডের মতো P=Pএবং রিলিজ বিল্ডেও রয়েছে ।

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

1
নোট করুন যে সি ++ 11 সাল থেকে আমাদের [[maybe_unused]]অ্যাট্রিবিউট রয়েছে
মেটাব্লাস্টার

2

আপনি যদি unreferenced local variableকিছু শিরোনামে লিখতে অক্ষম করতে চান

template<class T>
void ignore (const T & ) {}

আর ব্যবহার করুন

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

2
একটি ফাংশন কল, কেবল সতর্কতা দমন করতে? কেন আপনি এই পরিবর্তে কি না: (void)unusedVar;?
নওয়াজ

@ নাওয়াজ: আমার ধারণা (void)unusedVar;?সি ++ স্ট্যান্ডার্ড অনুষঙ্গ নয়।
আলেক্সি মালিস্তভ

2
এটি এমন একটি অভিব্যক্তি যার মূল্য কিছুই নয়। সি ++ এ আপনি করতেও পারেন static_cast<void>(unusedVar)
নওয়াজ


2
§5.2.9 / 4 বলছেন, Any expression can be explicitly converted to type “cv void.” The expression value is discardedআপনি লিখতে পারেন যা অনুযায়ী static_cast<void>(unusedVar)এবং static_cast<const void>(unusedVar)এবং static_cast<volatile void>(unusedVar)। সমস্ত ফর্ম বৈধ। আমি আশা করি এটি আপনার সন্দেহকে পরিষ্কার করে দিয়েছে।
নওয়াজ

2

নির্দিষ্ট পরিস্থিতিতে আপনার অবশ্যই একটি নামযুক্ত প্যারামিটার থাকতে হবে তবে আপনি এটি সরাসরি ব্যবহার করেন না।
উদাহরণস্বরূপ, আমি ভিএস 2010 এ ছুটেছি, যখন 'ই' কেবলমাত্র একটি decltypeবিবৃতিতে ব্যবহার করা হয়, সংকলকটি অভিযোগ করে তবে আপনার অবশ্যই নামটির পরিবর্তনশীল থাকতে হবে e

উপরোক্ত সমস্ত অ- #pragmaপরামর্শগুলি কেবল একটি একক বিবৃতি যুক্ত করতে সিদ্ধ হয়:

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

1
এখন (এমএস ভিএস ২০১৫ সংকলকটিতে) এর ফলে
সি 4702 অ্যাক্সেসযোগ্য

2

যেমনটি @ra Champion উল্লেখ করেছে, আপনি ঝনঝন জিসিসি তে থাকলে, সতর্কতাগুলি নাম্বার দ্বারা হয়, সংখ্যা নয় এবং আপনাকে এটি করতে হবে:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

এই তথ্য থেকে আসে এখানে

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