কয়েকটি লাইনের কোডের জন্য কীভাবে জিসিসি সতর্কতা অক্ষম করবেন


220

ভিজ্যুয়াল সি ++ এ এটি ব্যবহার করা সম্ভব #pragma warning (disable: ...)। এছাড়াও আমি দেখেছি যে জিসিসিতে আপনি প্রতি ফাইল সংকলক পতাকাগুলি ওভাররাইড করতে পারেন । "নেক্সট লাইন" এর জন্য, বা জিসিসি ব্যবহার করে কোডের আশেপাশে পুশ / পপ শব্দার্থবিজ্ঞানের সাহায্যে আমি কীভাবে এটি করতে পারি?


1
জিসিসি-তে নির্দিষ্ট সতর্কতাগুলি অক্ষম করার সম্ভাব্য সদৃশ - ওফস, আসলে সেই প্রশ্নটি নিজেই একটি দ্বিপাক্ষিক (তবে বন্ধ নয়)। এটি কেবল "সম্পর্কিত" এর অধীনে প্রদর্শিত হবে বলে মনে হয়। যাইহোক, এসও এর কাছে এটি বেশ কয়েকবার জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে।
টাইলার ম্যাকহেনরি

1
@ প্যাক্সিডিয়াবলো: আমি বিপরীত দিকে ডগই করছি। আমি সতর্কতার মাত্রাটি খুব উচ্চ করে ফেলেছি এবং সতর্কবার্তাটি এক লাইনে স্কোয়াশ করতে চাই যা আমি ঠিক করেছি যাচাই করেছি।
ম্যাট যোগদানকারী

4
@ টাইলার ম্যাকহেনরি: আপনি যদি আরও সতর্কতার সাথে পরীক্ষা করেছেন তবে আপনি খেয়াল করতে পারেন যে লিঙ্কযুক্ত প্রশ্নটিতে প্রতি ফাইল-ফাইল সমাধান রয়েছে, আমি অবশ্যই আমার নিজের প্রশ্নে অসন্তুষ্টিজনক বলে উল্লেখ করেছি (আমি লিঙ্কটি চুরিও করেছি)।
ম্যাট যোগদানকারী

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

উত্তর:


221

এটি প্রদর্শিত হয় যেতে পারে । আমি জিসিসির যে সংস্করণটি যুক্ত হয়েছিল তা নির্ধারণ করতে অক্ষম, তবে এটি জুন ২০১০ এর আগে ছিল।

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

#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 */

14
এক pushএবং দুটি popগুলি - pushশুরুতে অন্যটি নিখোঁজ হতে পারে ?
অতল গহ্বর 7

37
"# প্রগমা জিসিসি ডায়াগোনস্টিক পুশ # প্রগমা জিসিসি ডায়াগোনস্টিক পপ প্রতিটি ধাককের মতো ডায়াগনস্টিকের অবস্থা মনে রাখতে এবং প্রতিটি পপের সেই বিন্দুতে পুনরুদ্ধার করতে জোর করে ause " - জিসিসি ম্যানুয়াল থেকে: gcc.gnu.org/onlinesocs/gcc/Diagnostic-Pragmas.html
বোবপল

11
রেফারেন্সের জন্য, জিসিসি সংস্করণ 4.4.3 ত্রুটি / সতর্কতা / উপেক্ষা সমর্থন করে, তবে ধাক্কা / পপ নয়
ফ্রাঙ্কস্টার

12
জিসিসির প্রথম সংস্করণে ডায়াগনস্টিক পুশ / পপ ছিল জিসিসি 4.6.4 । আমি জিসিসি ডকুমেন্টেশনে
বিটেক

5
এটি লজ্জার বিষয় এটি বাস্তবে কার্যকর হয় না। কিছু ক্ষেত্রে, এটি আরও সতর্কতা উত্পন্ন করে। অথবা হতে পারে, আরও সঠিকভাবে, এটি জিসিসি 4.7 এর 5.1 এর মাধ্যমে অনুশীলনে কাজ করে না। দেখুন, উদাহরণস্বরূপ, সতর্কতা নিঃশব্দ করতে জিসিসি 'প্রগমা জিসিসি ডায়াগনস্টিক'কে সম্মান দেয় না
jww

108

সমস্ত কিছু নিখুঁত করতে, এটি সাময়িকভাবে একটি সতর্কতা অক্ষম করার উদাহরণ :

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-result"
    write(foo, bar, baz);
#pragma GCC diagnostic pop

আপনি আরও তথ্যের জন্য ডায়গনিস্টিক প্রাগমাসে জিসিসি ডকুমেন্টেশন চেক করতে পারেন ।


2
কাজ করা উচিত, তবে আমার gcc-4.9ঠিক এই লাইনটি সম্পূর্ণ উপেক্ষা করে।
আলেক্সি পেট্রেনকো

31

টিএল; ডিআর : এটি যদি কাজ করে তবে এড়িয়ে চলুন বা __attribute__অন্যথায় স্পেসিফায়ার ব্যবহার করুন _Pragma

এটি আমার ব্লগ নিবন্ধটির একটি সংক্ষিপ্ত সংস্করণ যা জিসিসি এবং কলংয়ের সতর্কতাগুলি দমন করে

নিম্নোক্ত বিবেচনা কর Makefile

CPPFLAGS:=-std=c11 -W -Wall -pedantic -Werror

.PHONY: all
all: puts

নিম্নলিখিত puts.cউত্স কোড নির্মাণের জন্য

#include <stdio.h>

int main(int argc, const char *argv[])
{
    while (*++argv) puts(*argv);
    return 0;
}

এটি সংকলিত হবে না কারণ argcঅব্যবহৃত এবং সেটিংসটি কঠোর (-W -Wall -pedantic -Werror )।

5 টি জিনিস আপনি করতে পারেন:

  • যদি সম্ভব হয় তবে উত্স কোডটি উন্নত করুন
  • একটি ঘোষণা স্পেসিফায়ার ব্যবহার করুন __attribute__
  • ব্যবহার _Pragma
  • ব্যবহার #pragma
  • একটি কমান্ড লাইন বিকল্প ব্যবহার করুন।

উত্স উন্নতি

সতর্কতা থেকে মুক্তি পেতে উত্স কোডটি উন্নত করা যায় কিনা তা প্রথম চেষ্টা করা উচিত। এক্ষেত্রে আমরা কেবল অ্যালগরিদমটি পরিবর্তন করতে চাই না, যেমনটি argcঅনর্থক !*argv(NULL শেষ উপাদানটির পরে) ।

যেমন একটি ঘোষণা স্পেসিফায়ার ব্যবহার __attribute__

#include <stdio.h>

int main(__attribute__((unused)) int argc, const char *argv[])
{
    while (*++argv) puts(*argv);
    return 0;
}

আপনি যদি ভাগ্যবান হন তবে স্ট্যান্ডার্ডটি আপনার পরিস্থিতির জন্য একটি নির্দিষ্টকরণ সরবরাহ করে _Noreturn

__attribute__মালিকানাধীন জিসিসি এক্সটেনশন (ক্ল্যাং এবং অন্যান্য কয়েকটি সংকলকও সমর্থিত armcc) এবং অন্য অনেক সংকলক বুঝতে পারবেন না। __attribute__((unused))আপনি পোর্টেবল কোড চাইলে ম্যাক্রোর ভিতরে রাখুন ।

_Pragma অপারেটর

_Pragmaবিকল্প হিসাবে ব্যবহার করা যেতে পারে #pragma

#include <stdio.h>

_Pragma("GCC diagnostic push")
_Pragma("GCC diagnostic ignored \"-Wunused-parameter\"")

int main(int argc, const char *argv[])
{
    while (*++argv) puts(*argv);
    return 0;
}
_Pragma("GCC diagnostic pop")

_Pragmaঅপারেটরের প্রধান সুবিধাটি হ'ল আপনি এটিকে ম্যাক্রোগুলির অভ্যন্তরে রেখে দিতে পারেন, যা #pragmaনির্দেশ দিয়ে সম্ভব নয় ।

ডাউনসাইড: এটি প্রায় একটি কৌশলগত অনুমান, কারণ এটি ঘোষণা-ভিত্তিকের পরিবর্তে লাইন-ভিত্তিক কাজ করে।

_Pragmaঅপারেটর C99 চালু করা হয়।

#pragma নির্দেশে।

কোডের অঞ্চলের জন্য সতর্কতাটি দমন করতে আমরা উত্স কোডটি পরিবর্তন করতে পারি, সাধারণত একটি সম্পূর্ণ ফাংশন:

#include <stdio.h>

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
int main(int argc, const char *argv[])
{
    while (*++argc) puts(*argv);
    return 0;
}
#pragma GCC diagnostic pop

ডাউনসাইড: এটি প্রায় একটি কৌশলগত অনুমান, কারণ এটি ঘোষণা-ভিত্তিকের পরিবর্তে লাইন-ভিত্তিক কাজ করে।

নোট করুন যে ঝাঁকুনিতে একই ধরণের সিনট্যাক্স বিদ্যমান ।

একক ফাইলের জন্য কমান্ড লাইনে সতর্কতা দমন করা

Makefileবিশেষত পুটগুলির জন্য সতর্কবার্তাটি দমন করতে আমরা নিম্নলিখিত লাইনটি যুক্ত করতে পারি :

CPPFLAGS:=-std=c11 -W -Wall -pedantic -Werror

.PHONY: all
all: puts

puts.o: CPPFLAGS+=-Wno-unused-parameter

এটি সম্ভবত আপনার বিশেষ ক্ষেত্রে আপনি চান না, তবে এটি অন্যান্য পাঠকদের যারা একই পরিস্থিতিতে আছেন তাদের সহায়তা করতে পারে।


2
পুনরায়: যুক্তির নাম না improving the sourceদিয়ে মূল ঘোষণাকে পরিবর্তন করতেও এটি কাজ করবে int main(int, const char* argv[]) { ... }, আপনি সংকলককে বলবেন এটি অব্যবহৃত হবে।
জেসি চিশলম

1
ফাংশন সংজ্ঞাতে @ জেসি চিসলম প্যারামিটারের নাম বাদ দেওয়া সম্ভব নয়। আইএসও / আইইসি ৯৮৯৯, §5 এর 9.৯.১ এর কার্যকারিতা সংজ্ঞাগুলি দেখুন §5 "যদি ঘোষককে প্যারামিটার ধরণের তালিকা অন্তর্ভুক্ত থাকে তবে প্রতিটি প্যারামিটারের ঘোষণায় একটি সনাক্তকারী অন্তর্ভুক্ত করা উচিত […]" এবং সঠিকভাবে তাই কোডটি gccপাশাপাশি বাতিল করে দেওয়া হবে clang
ক্রিশ্চিয়ান হুজার

1
অন্য একটি প্যাটার্নটি হ'ল কেবল অকার্যকর হয়ে যাওয়ার জন্য ভেরিয়েবলের একটি castালাই করা। প্রকৃতপক্ষে, আমি একটি প্রকল্পে নিম্নলিখিত ম্যাক্রোতে দেখেছি: #define UNUSED(x) ((void)x)সতর্কতাগুলি নিঃশব্দ করার জন্য ব্যবহৃত হয়েছিল। আমি মনে করি এটি রিঅ্যাকটোসে ছিল?
পল স্টেলিয়ান

1
আমি মনে করি না এর পরে আপনার ব্যাকস্ল্যাশ দরকার, না? আমি _Pragma("GCC diagnostic pop") \ ঠিক _Pragma("GCC diagnostic pop")মনে করি।
গ্যাব্রিয়েল স্টেপলস

1
@ গ্যাব্রিয়েল স্ট্যাপলস এটি সঠিক, লক্ষ্য করার জন্য ধন্যবাদ, আমি উত্তরটি আপডেট করেছি।
খ্রিস্টান হুজার

20
#define DIAG_STR(s) #s
#define DIAG_JOINSTR(x,y) DIAG_STR(x ## y)
#ifdef _MSC_VER
#define DIAG_DO_PRAGMA(x) __pragma (#x)
#define DIAG_PRAGMA(compiler,x) DIAG_DO_PRAGMA(warning(x))
#else
#define DIAG_DO_PRAGMA(x) _Pragma (#x)
#define DIAG_PRAGMA(compiler,x) DIAG_DO_PRAGMA(compiler diagnostic x)
#endif
#if defined(__clang__)
# define DISABLE_WARNING(gcc_unused,clang_option,msvc_unused) DIAG_PRAGMA(clang,push) DIAG_PRAGMA(clang,ignored DIAG_JOINSTR(-W,clang_option))
# define ENABLE_WARNING(gcc_unused,clang_option,msvc_unused) DIAG_PRAGMA(clang,pop)
#elif defined(_MSC_VER)
# define DISABLE_WARNING(gcc_unused,clang_unused,msvc_errorcode) DIAG_PRAGMA(msvc,push) DIAG_DO_PRAGMA(warning(disable:##msvc_errorcode))
# define ENABLE_WARNING(gcc_unused,clang_unused,msvc_errorcode) DIAG_PRAGMA(msvc,pop)
#elif defined(__GNUC__)
#if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406
# define DISABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,push) DIAG_PRAGMA(GCC,ignored DIAG_JOINSTR(-W,gcc_option))
# define ENABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,pop)
#else
# define DISABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,ignored DIAG_JOINSTR(-W,gcc_option))
# define ENABLE_WARNING(gcc_option,clang_option,msvc_unused) DIAG_PRAGMA(GCC,warning DIAG_JOINSTR(-W,gcc_option))
#endif
#endif

এটি জিসিসি, কলং এবং এমএসভিসি-র জন্য কৌশলটি করা উচিত

উদাহরণস্বরূপ বলা যেতে পারে:

DISABLE_WARNING(unused-variable,unused-variable,42)
[.... some code with warnings in here ....]
ENABLE_WARNING(unused-variable,unused-variable,42)

দেখতে https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html , http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas এবং https://msdn.microsoft .com / ডি-ডি / লাইব্রেরি / d9x1s805.aspx আরও তথ্যের জন্য

জিসিসির জন্য এই জাতীয় প্রগমা ব্যবহার করার জন্য আপনার কমপক্ষে 4.02 সংস্করণ প্রয়োজন, সংস্করণগুলি সম্পর্কে এমএসভিসি এবং ঝাঁকুনির বিষয়ে নিশ্চিত নন।

দেখে মনে হচ্ছে জিসিসির জন্য পুশ পপ প্রাগমা হ্যান্ডলিংটি কিছুটা ভাঙা। আপনি যদি সতর্কতাটি আবার সক্ষম করে থাকেন তবে আপনি এখনও ডিআইএসএবিএল_ওয়ার্নিং / এনএবেল_ওয়ার্নিং ব্লকের ভিতরে থাকা ব্লকের জন্য সতর্কতা পান। জিসিসি-র কিছু সংস্করণে এটি কাজ করে, কিছুগুলির জন্য এটি কাজ করে না।


3
আপনি দা রিয়েল এমভিপি
জেডোইডলুন্ড

19
#pragma GCC diagnostic ignored "-Wformat"

আপনার সতর্কতা পতাকার নামের সাথে "-ফর্ম্যাট" প্রতিস্থাপন করুন।

আফাইক এই বিকল্পের জন্য পুশ / পপ শব্দার্থবিজ্ঞান ব্যবহার করার কোনও উপায় নেই।


4
এটি লজ্জার বিষয় এটি বাস্তবে কার্যকর হয় না। কিছু ক্ষেত্রে, এটি আরও সতর্কতা উত্পন্ন করে। অথবা হতে পারে, আরও সঠিকভাবে, এটি জিসিসি 4.7 এর 5.1 এর মাধ্যমে অনুশীলনে কাজ করে না। দেখুন, উদাহরণস্বরূপ, সতর্কতা নিঃশব্দ করতে জিসিসি 'প্রগমা জিসিসি ডায়াগনস্টিক'কে সম্মান দেয় না
jww

6

আরওএস শিরোনামের মতো বাহ্যিক লাইব্রেরিতে আমার একই সমস্যা ছিল। আমি কঠোর সংকলনের জন্য সিএমকেলিস্ট.টেক্সটে নিম্নলিখিত বিকল্পগুলি ব্যবহার করতে চাই:

set(CMAKE_CXX_FLAGS "-std=c++0x -Wall -Wextra -Wstrict-aliasing -pedantic -Werror -Wunreachable-code ${CMAKE_CXX_FLAGS}")

তবে এটি করার ফলে বাহ্যিকভাবে অন্তর্ভুক্ত গ্রন্থাগারগুলিতে সমস্ত ধরণের পেডেন্টিক ত্রুটি ঘটায়। সমাধানটি হ'ল বাহ্যিক লাইব্রেরিগুলি অন্তর্ভুক্ত করার আগে এবং সমস্ত পুনরায় সক্ষম করার আগে সমস্ত পেডেন্টিক সতর্কতাগুলি অক্ষম করে দেওয়া:

//save compiler switches
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"

//Bad headers with problem goes here
#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>

//restore compiler switches
#pragma GCC diagnostic pop

2
এটিকে আরও ভালভাবে জিসিসির সিস্টেম ডিরেক্টরি দ্বারা পরিচালনা করা উচিত নয় ?
রেড দ্বাদশ

@ রেডএক্সআইআইআই - হ্যাঁ, আপনি যদি এই জাতীয় ডিরেক্টরিগুলির তালিকা তৈরি করতে এবং জিসিসি কমান্ড লাইনে নির্দিষ্ট করতে পারেন তবে এটি একটি বিকল্প। তবে বহুবার সংকলক পাইপলাইনের গভীরে ডেকে আনে বা অন্য কেউ কীভাবে আপনার কোডটি সংকলন করবে সে সম্পর্কে আপনার খুব বেশি নিয়ন্ত্রণ নেই। উপরোক্ত ক্ষেত্রে সম্ভবত একটি ভাল সমাধান।
শীতল শাহ

5

আমি জানি প্রশ্নটি জিসিসি সম্পর্কে, তবে অন্যান্য এবং / অথবা একাধিক সংকলকগুলিতে কীভাবে এটি করা যায় তা সন্ধানকারী লোকদের জন্য ...

টি এল; ডিআর

আপনি হেডলিকে একবার দেখে নিতে চাইতে পারেন , এটি আমি যে পাবলিক-ডোমেন একক সি / সি ++ শিরোনাম লিখেছি যা অনেক কিছু করে আপনার জন্য এই জিনিসগুলির পরিমাণে করে। এই পোস্টের শেষে এই সমস্তটির জন্য কীভাবে হেডলি ব্যবহার করবেন সে সম্পর্কে আমি একটি দ্রুত বিভাগ স্থাপন করব।

সতর্কতা অক্ষম করা হচ্ছে

#pragma warning (disable: …) বেশিরভাগ সংকলকগুলিতে সমতুল্য রয়েছে:

  • MSVC: #pragma warning(disable:4996)
  • জিসিসি: #pragma GCC diagnostic ignored "-W…"যেখানে উপবৃত্তি হ'ল সতর্কতার নাম; যেমন , #pragma GCC diagnostic ignored "-Wdeprecated-declarations
  • ঝনঝন: #pragma clang diagnostic ignored "-W…"। বাক্য গঠনটি মূলত জিসিসির মতো এবং সতর্কতার অনেকগুলি নাম একই (যদিও অনেকগুলি তা নয়)।
  • ইন্টেল সি সংকলক: এমএসভিসি সিনট্যাক্স ব্যবহার করুন, তবে মনে রাখবেন যে সতর্কতা নম্বরগুলি সম্পূর্ণ আলাদা। উদাহরণ:#pragma warning(disable:1478 1786)
  • পিজিআই: আছে একটি diag_suppress প্রগমা আছে:#pragma diag_suppress 1215,1444
  • টিআই: একটি আছে diag_suppress পিজিআইয়ের মতো একই সিনট্যাক্সের (তবে বিভিন্ন সতর্কতা সংখ্যা!) সহ প্রাগমা রয়েছে:pragma diag_suppress 1291,1718
  • ওরাকল ডেভেলপার স্টুডিও (সানসিসি): একটি error_messagesপ্রগমা রয়েছে। বিরক্তিকরভাবে, সতর্কতাগুলি সি এবং সি ++ সংকলকগুলির জন্য পৃথক। এই দুটিই মূলত একই সতর্কতাগুলি অক্ষম করে:
    • সি: #pragma error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)
    • সি ++: #pragma error_messages(off,symdeprecated,symdeprecated2)
  • আইএআর: diag_suppressপিজিআই এবং টিআইয়ের মতো ব্যবহার করে তবে বাক্য গঠনটি ভিন্ন is কিছু সতর্কতা নম্বর একই, তবে আমি অন্যরা সরিয়ে নিয়েছি:#pragma diag_suppress=Pe1444,Pe1215
  • পেলস সি: এমএসভিসির অনুরূপ, যদিও আবার সংখ্যাগুলি পৃথক #pragma warn(disable:2241)

বেশিরভাগ সংকলকগুলির জন্য প্রায়শই সংকলক সংস্করণটি অক্ষম করার চেষ্টা করার আগে এটি পরীক্ষা করা ভাল ধারণা, অন্যথায় আপনি কেবল অন্য সতর্কতাটি শুরু করবেন। উদাহরণস্বরূপ, জিসিসি 7 -Wimplicit-fallthroughসতর্কতার জন্য সমর্থন যুক্ত করেছে , সুতরাং যদি আপনি 7 এর আগে জিসিসির বিষয়ে চিন্তা করেন তবে আপনার মতো কিছু করা উচিত

#if defined(__GNUC__) && (__GNUC__ >= 7)
#  pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
#endif

এক্সএল সি / সি ++ এবং আর্মক্ল্যাংয়ের নতুন সংস্করণগুলির মতো ক্ল্যাংয়ের উপর ভিত্তি করে ক্ল্যাং এবং সংকলকগুলির জন্য, সংকলকটি __has_warning()ম্যাক্রো ব্যবহার করে কোনও নির্দিষ্ট সতর্কতা সম্পর্কে জানে কিনা তা পরীক্ষা করে দেখতে পারেন ।

#if __has_warning("-Wimplicit-fallthrough")
#  pragma clang diagnostic ignored "-Wimplicit-fallthrough"
#endif

অবশ্যই আপনাকে __has_warning()ম্যাক্রো বিদ্যমান কিনা তা পরীক্ষা করে দেখতে হবে :

#if defined(__has_warning)
#  if __has_warning("-Wimplicit-fallthrough")
#    pragma clang diagnostic ignored "-Wimplicit-fallthrough"
#  endif
#endif

আপনি যেমন কিছু করতে প্রলুব্ধ হতে পারে

#if !defined(__has_warning)
#  define __has_warning(warning)
#endif

তাই আপনি __has_warningআরও কিছুটা সহজে ব্যবহার করতে পারেন। বিড়ম্বনা এমনকি __has_builtin()তাদের ম্যানুয়ালটিতে ম্যাক্রোর জন্য অনুরূপ কিছু প্রস্তাব দেয় । এটি করবেন না । অন্যান্য __has_warningকোডগুলি চেক করতে পারে এবং সংকলক সংস্করণগুলি উপস্থিত না থাকলে তা পরীক্ষা করে ফিরে যেতে পারে এবং আপনি যদি সংজ্ঞা দেন তবে আপনি __has_warningতাদের কোডটি ভেঙে দিবেন । এটি করার সঠিক উপায় হ'ল আপনার নেমস্পেসে ম্যাক্রো তৈরি করা। উদাহরণ স্বরূপ:

#if defined(__has_warning)
#  define MY_HAS_WARNING(warning) __has_warning(warning)
#else
#  define MY_HAS_WARNING(warning) (0)
#endif

তারপরে আপনি যেমন স্টাফ করতে পারেন

#if MY_HAS_WARNING(warning)
#  pragma clang diagnostic ignored "-Wimplicit-fallthrough"
#elif defined(__GNUC__) && (__GNUC__ >= 7)
#  pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
#endif

ঠেলাঠেলি এবং পপিং

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

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated"
call_deprecated_function();
#pragma GCC diagnostic pop

সংশ্লেষ সম্পর্কে অবশ্যই কম্পাইলারগুলির মধ্যে প্রচুর চুক্তি নেই:

  • জিসিসি 4.6+: #pragma GCC diagnostic push/#pragma GCC diagnostic pop
  • ঝনঝনানি: #pragma clang diagnostic push/#pragma diagnostic pop
  • ইন্টেল 13+ (এবং সম্ভবত পূর্বে): #pragma warning(push)/#pragma warning(pop)
  • এমএসভিসি 15+ (ভিএস 9.0 / 2008): #pragma warning(push)/#pragma warning(pop)
  • এআরএম 5.6+: #pragma push/#pragma pop
  • টিআই 8.1+: #pragma diag_push/#pragma diag_pop
  • পেলস সি 2.90+ (এবং সম্ভবত পূর্বে): #pragma warning(push)/#pragma warning(pop)

মেমরিটি যদি পরিষেবা দেয় তবে জিসিসির বেশ কয়েকটি পুরানো সংস্করণের (৩.x, আইআইআরসি) এর জন্য পুশ / পপ প্রাগমাসের বাইরে থাকতে হবে ফাংশনের ।

গোড়ালি বিশদ লুকানো

বেশিরভাগ সংকলকগুলির জন্য ম্যাক্রোগুলি ব্যবহারের পিছনে যুক্তি লুকানো সম্ভব _Pragma, যা C99 সালে চালু হয়েছিল। এমনকি নন-সি 99 মোডে, বেশিরভাগ সংকলক সমর্থন করে _Pragma; বড় ব্যতিক্রম হ'ল এমএসভিসি, যার নিজস্ব বাক্যাংশ রয়েছে __pragmaআলাদা সিনট্যাক্সের সাথে। স্ট্যান্ডার্ডটি _Pragmaএকটি স্ট্রিং নেয়, মাইক্রোসফ্টের সংস্করণ এটি করে না:

#if defined(_MSC_VER)
#  define PRAGMA_FOO __pragma(foo)
#else
#  define PRAGMA_FOO _Pragma("foo")
#endif
PRAGMA_FOO

মোটামুটি সমান, একবার প্রিপ্রোসেসেড, টু

#pragma foo

এটি আমাদের ম্যাক্রোগুলি তৈরি করতে দেয় যাতে আমরা কোডের মতো লিখতে পারি

MY_DIAGNOSTIC_PUSH
MY_DIAGNOSTIC_DISABLE_DEPRECATED
call_deprecated_function();
MY_DIAGNOSTIC_POP

এবং সমস্ত কুরুচিপূর্ণ সংস্করণ চেকগুলি ম্যাক্রো সংজ্ঞাগুলিতে লুকিয়ে রাখুন।

সহজ উপায়: হেডলি

আপনার কোডটি পরিষ্কার রাখার সময় আপনি কীভাবে এই ধরণের জিনিসগুলি পোর্টেবল করতে চান তার মেকানিক্স বুঝতে পেরে, আপনি বুঝতে পেরেছেন যে আমার প্রকল্পগুলির মধ্যে একটি, হিডলি কী করে। টন ডকুমেন্টেশনগুলির মাধ্যমে খনন এবং / বা যতগুলি সংকলক হিসাবে আপনি পরীক্ষা করতে পারেন তার অধিক সংস্করণ ইনস্টল করার পরিবর্তে আপনি কেবল হিডলি (এটি একটি একক পাবলিক ডোমেন সি / সি ++ শিরোনাম) অন্তর্ভুক্ত করতে পারেন এবং এটি দিয়ে সম্পন্ন করা যেতে পারে। উদাহরণ স্বরূপ:

#include "hedley.h"

HEDLEY_DIAGNOSTIC_PUSH
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
call_deprecated();
HEDLEY_DIAGNOSTIC_POP

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


3

সতর্কতাগুলি স্থির করার পরিবর্তে, জিসিসি স্টাইলটি সাধারণত স্ট্যান্ডার্ড সি কনস্ট্রাক্ট বা __attribute__এক্সটেনশনটি ব্যবহার করে আপনার উদ্দেশ্য সম্পর্কে কমপ্লেয়ারকে আরও জানান। উদাহরণস্বরূপ, শর্ত হিসাবে ব্যবহৃত অ্যাসাইনমেন্ট সম্পর্কে সতর্কতা অ্যাসাইনমেন্টটি প্রথম বন্ধনীর মধ্যে স্থাপনের if ((p=malloc(cnt)))পরিবর্তে দমন করা হয় if (p=malloc(cnt))। অব্যবহৃত ফাংশন আর্গুমেন্ট সম্পর্কে সতর্কতাগুলি এমন কিছু বিজোড় দ্বারা দমন করা যেতে পারে যা __attribute__আমি কখনই স্মরণ করতে পারি না বা স্ব-কার্য-সম্পাদনা ইত্যাদির মাধ্যমে ইত্যাদি But তবে সাধারণত আমি ঠিক বিশ্বব্যাপী এমন কোনও সতর্কতা বিকল্প অক্ষম করা পছন্দ করি যা সঠিক কোডে ঘটবে এমন জিনিসগুলির জন্য সতর্কতা উত্পন্ন করে।


2
হয়তো তাই. আমার উদ্দেশ্য কোনও সাধারণ কেস প্যাটার্ন প্রমাণ করার নয়, বরং সতর্কতা দমন সম্পর্কে জিসিসির দর্শন কী বলে মনে হচ্ছে তা পর্যবেক্ষণ।
আর .. গিথহাব থামিয়ে দিচ্ছে সহায়তা আইসিসি

সংকলক যুক্ত করা প্রথম বন্ধনীর সাথে ডাব্লু / আর / টি সতর্কতাগুলির সাথে আলাদা আচরণ করে?!?! ?? !!!! কি দারুন! তা অপ্রত্যাশিত।
জেসন এস

1
@ জেসনস প্যারেনস কম্পাইলারের আচরণের প্রতিপন্ন করার সতর্কবাণী পরিবর্তন করেন না, এটি যা করে তা হল বিবৃতিটির শব্দার্থকে পরিবর্তন করে। অতিরিক্ত প্যারেন্স সংকলককে কার্য শেষ করে তোলে এবং এর চূড়ান্ত মানটিকে একটি অভিব্যক্তি হিসাবে রাখে, যা কোনও সতর্কতার দাবিদার নয়। আপনি যদি স্পষ্টতা চান, আপনি বলতে পারেন if ((p=malloc(cnt)) != NULL) ...যে পর্দার পিছনে সংকলক এটি করছে।
জেসি চিশলম

@ জেসি চিসলম: আপনার ব্যাখ্যাটি সঠিক বলে আমি মনে করি না।
আর .. গিটহাব বন্ধ করুন ICE

3

যারা এই পৃষ্ঠাটি আইএআর-এ এটি করার উপায় খুঁজছেন তাদের জন্য এটি চেষ্টা করুন:

#pragma diag_suppress=Pe177
void foo1( void )
{
   /* The following line of code would normally provoke diagnostic 
      message #177-D: variable "x" was declared but never referenced.
      Instead, we have suppressed this warning throughout the entire 
      scope of foo1(). 
   */
   int x;
}
#pragma diag_default=Pe177

রেফারেন্সের জন্য http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472m/chr1359124244797.html দেখুন ।

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