অনুবাদ ইউনিটের কেবলমাত্র অংশের জন্য বেছে বেছে জিসিসি সতর্কতা অক্ষম করবেন?


85

এই এমএসভিসি প্রিপ্রসেসর কোডটির নিকটতম জিসিসি সমতুল্য কী?

#pragma warning( push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

আমাদের কাছে সাধারণত অন্তর্ভুক্ত শিরোনামগুলিতে কোড রয়েছে যা আমরা একটি নির্দিষ্ট সতর্কতা উত্পন্ন করতে চাই না। তবে আমরা ফাইলগুলি চাই যেখানে সেই শিরোনামগুলি অন্তর্ভুক্ত করে সেই সতর্কতা উত্পন্ন করা চালিয়ে যেতে পারে (যদি প্রকল্পটিতে সেই সতর্কতা সক্ষম থাকে)


যদি শিরোনামগুলি / usr / অন্তর্ভুক্ত থাকে বা আপনার জিসিসি রয়েছে তা ডিফল্টরূপে তাদের জন্য সতর্কতা তৈরি করে না।
স্পুড 86

উত্তর:


95

৪.CC সংস্করণ থেকে জুনিয়াল বা ট্রাঙ্কে জুন ২০১০-এর কাছাকাছি এটি সম্ভব

এখানে একটি উদাহরণ:

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */

8
পুসি এবং পপ কার্যকারিতাটি জিসিসি ৪.6 ( gcc.gnu.org/onlinesocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html ) এ যুক্ত হয়েছিল।
ডেভ জোহেনসেন

4
আপনার দু'বার পপ করতে গেলে আপনি সম্ভবত দুবার চাপ দিতে চাইবেন।
ড্যান

4
@ ড্যান: ম্যানুয়ালটি পড়ুন, এবং মন্তব্য করুন। উদাহরণটির উত্স নোট করুন।
ম্যাট জয়েনার

4.4.7 এর মতো পুরানো সংস্করণগুলির জন্য এফওয়াইআই আপনি এখনও এটি ব্যবহার করতে পারেন #pragma GCC diagnostic [error|warning|ignored]তবে এটি popকার্যকর / সমর্থিত নয়।
ট্রেভর বয়ড স্মিথ

36

নিকটস্থ জিনিস জিসিসি ডায়গনিস্টিক pragma , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"। এটি আপনি যা চান তার খুব কাছাকাছি নয়, এবং বিশদ এবং সতর্কতার জন্য লিঙ্কটি দেখুন।


4
আপনি কী জানেন কোথায় এবং কোথায় এই বৈশিষ্ট্যটি যুক্ত না করার যুক্তি হতে পারে? (আমি এটি খুঁজে পেলাম না)) আমি সতর্কতাটি পশ-অক্ষম-পপকে দরকারী বলে মনে করি।

4
আমি সত্যিই এটি কল্পনাও করতে পারি না যে, জিসিসিতে "বৈশিষ্ট্যগুলি যুক্ত না করা" এর পক্ষে যুক্তিযুক্তি এতটা প্রবণতা রয়েছে যে কারও কার্যকরী প্যাচ জমা দেওয়ার অনুপস্থিতি।
বিশৃঙ্খলা

14
এটি এমন নয় যে কেউ এই ধরণের সূক্ষ্ম ধরণের সতর্কতা নিয়ন্ত্রণের জন্য জিসিসিতে কাজ করতে রাজি নয়, বা কোডটি জমা দিতে পারে - আমি সিলিকন ভ্যালি কর্পোরেশনের একটি ইতিমধ্যে জানি যে এটি ইতিমধ্যে করেছে, এবং অন্যটি কাউকে বেতন দিতে পেরে আনন্দিত হত এটি করতে এবং কোডটি স্রোতে আনতে। পরিবর্তে, কোনও লোকের সাথে আলোচনার প্রতি যারা (জিডিবি রক্ষণাবেক্ষণকারীদের মধ্যে একজন) এই স্টাফটিতে লাগিয়েছেন, জিসিসি রক্ষণাবেক্ষণকারীদের একটি দর্শন আছে: "যদি কোনও সতর্কতা থাকে তবে এটি একটি ত্রুটিযুক্ত এবং আপনার এটি ঠিক করা দরকার" " সুতরাং (ইমো) এটি একটি ধর্মীয় যুক্তি, এবং তারা কোডটি নিয়ন্ত্রণ করে যাতে তারা জিতে যায়।
বব মারফি

বব এর মন্তব্যে যোগ করার জন্য, জিসিসি বিকাশকারীদের এই #pragmaনির্দেশকে অপছন্দ করার ইতিহাস রয়েছে , তাই জিসিসি-নির্দিষ্ট যে কোনও কিছু সম্ভবত সম্ভবত হিসাবে প্রয়োগ হওয়ার সম্ভাবনা রয়েছে __attribute__((foo))
টম

10
নতুন জিসিসি (> = 4.4) এর #pragma GCC push_optionsফলে আপনি কেবল ডায়াগনস্টিক্সের চেয়ে আরও বেশি কিছু নিয়ে বেড়াতে পারেন
স্পড 8686

33

আমিও তেমন কিছু করেছি। তৃতীয় পক্ষের কোডের জন্য, আমি কোনও সতর্কতা দেখতে মোটেই চাইনি। সুতরাং, বরং উল্লেখ চেয়ে -I/path/to/libfoo/include, আমি ব্যবহার -isystem /path/to/libfoo/include। এটি সংকলক সতর্কতার উদ্দেশ্যে সেই শিরোলেখ ফাইলগুলিকে "সিস্টেম হেডার" হিসাবে বিবেচনা করে এবং যতক্ষণ আপনি সক্ষম না করেন ততক্ষণ -Wsystem-headersআপনি বেশিরভাগ সুরক্ষিত থাকেন। আমি এখনও কিছু সতর্কতা সেখান থেকে ফুটে উঠতে দেখেছি, তবে এটি বেশিরভাগ জঞ্জালকে হ্রাস করে।

মনে রাখবেন যে কেবলমাত্র যদি আপনি অন্তর্ভুক্ত ডিরেক্টরিটি দ্বারা আপত্তিজনক কোডটি আলাদা করতে পারেন তবে এটি আপনাকে সহায়তা করে helps যদি এটি আপনার নিজের প্রকল্পের কেবলমাত্র একটি উপসেট হয়, বা অন্য কোডের সাথে মিলে যায় তবে আপনার ভাগ্য খারাপ।


4
দুর্দান্ত টিপ। যদি এলএলভিএম ব্যবহার করে, "অ্যাপল এলএলভিএম সংকলক - ভাষা" বিভাগে "অন্যান্য সি পতাকা" এর অধীনে-সিস্টেমের পতাকাটি যুক্ত করুন।
নেস্টর

@ টম ভাগ করে নেওয়ার জন্য ধন্যবাদ। আপনার সমাধানটি কোথায় ব্যবহার করব তা আমি বুঝতে পারি না। আপনি কি আরও কিছু বলতে পারেন?
লোরেঞ্জো বি 12

1

এটি ম্যাট জয়েনারের উত্তরের একটি সম্প্রসারণ ।

আপনি যদি নিজের কোড জুড়ে প্রাগমাস স্প্যান করতে না চান তবে আপনি_প্রগ্রাম অপারেটরটি ব্যবহার করতে পারেন :

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_PUSH
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

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