আমি জানি প্রশ্নটি জিসিসি সম্পর্কে, তবে অন্যান্য এবং / অথবা একাধিক সংকলকগুলিতে কীভাবে এটি করা যায় তা সন্ধানকারী লোকদের জন্য ...
টি এল; ডিআর
আপনি হেডলিকে একবার দেখে নিতে চাইতে পারেন , এটি আমি যে পাবলিক-ডোমেন একক সি / সি ++ শিরোনাম লিখেছি যা অনেক কিছু করে আপনার জন্য এই জিনিসগুলির পরিমাণে করে। এই পোস্টের শেষে এই সমস্তটির জন্য কীভাবে হেডলি ব্যবহার করবেন সে সম্পর্কে আমি একটি দ্রুত বিভাগ স্থাপন করব।
সতর্কতা অক্ষম করা হচ্ছে
#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
হিডলি কেবলমাত্র হিডলি সম্পর্কেই জানেন, বা সমস্ত হিডলি যে সতর্কতাগুলি করতে পারেন তা অক্ষম করছে না, তবে আশা করি আপনি এই ধারণাটি পেয়ে যাবেন।