অব্যবহৃত ভেরিয়েবল সম্পর্কে সতর্কবার্তাটি আমি কীভাবে চুপ করে থাকব?


236

আমার একটি ক্রস প্ল্যাটফর্ম অ্যাপ্লিকেশন রয়েছে এবং আমার কয়েকটি ফাংশনে ফাংশনে পাস করা সমস্ত মান ব্যবহার করা হয় না। অতএব আমি জিসিসির কাছ থেকে একটি সতর্কতা পেয়েছি যে আমাকে বলছে যে অব্যবহৃত চলক রয়েছে।

সতর্কতার আশেপাশে কোডিংয়ের সর্বোত্তম উপায় কী হবে?

ফাংশনটির চারপাশে একটি # আইডিডিফ?

#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{

এটি এতই কুৎসিত তবে মনে হয় কম্পাইলারটি যেভাবে পছন্দ করবে।

অথবা আমি ফাংশন শেষে ভেরিয়েবলের শূন্য নির্ধারণ করব? (যা আমি ঘৃণা করি কারণ এটি একটি সংকলক সতর্কতা নিঃশব্দ করতে প্রোগ্রাম প্রবাহে কিছু পরিবর্তন করছে)।

কোন সঠিক উপায় আছে?


7
আমি ঠিক বুঝতে পেরেছি আপনি গত নভেম্বর মাসে একটি অনুরূপ প্রশ্ন জিজ্ঞাসা করেছিলেন। এ কারণেই এটিকে পরিচিত মনে হচ্ছে! ;) স্ট্যাকওভারফ্লো
অ্যালেক্স বি

9
উভয় সংকলক জন্য কেন তাদের মন্তব্য করবেন না? আর্গুমেন্টটি যদি কোনওটিতে অব্যবহৃত থাকে তবে এটি সম্ভবত অন্যটির জন্য অব্যবহৃত হবে ...
রজার লিপসক্বে

12
আপনার জানা উচিত যে কিউটিটির Q_UNUSEDকেবল এই জন্য ম্যাক্রো রয়েছে । ডকুমেন্টেশন এ এটি পরীক্ষা করে দেখুন।
ইভান তেরান

1
: সি সমাধান C ++ খুব কাজ করে জরিমানা stackoverflow.com/a/3599170/1904815
JonnyJD

-না-অব্যবহৃত-প্যারামিটারও একটি বিকল্প হতে পারে যদি আপনার কাছে সংকলক-নির্দিষ্ট বিল্ড পতাকা থাকতে পারে
কোড অ্যাবমিনেটর

উত্তর:


326

আপনি এটি " (void)var;" এক্সপ্রেশনটিতে রাখতে পারেন (কিছুই করেন না) যাতে কোনও সংকলক দেখতে পায় যে এটি ব্যবহার করা হয়েছে। এটি সংকলকগুলির মধ্যে পোর্টেবল।

যেমন

void foo(int param1, int param2)
{
    (void)param2;
    bar(param1);
}

অথবা,

#define UNUSED(expr) do { (void)(expr); } while (0)
...

void foo(int param1, int param2)
{
    UNUSED(param2);
    bar(param1);
}

22
+1 - তবুও আমি ডকুমেন্ট করব কেন আপনি ভেরিয়েবলটি সেখানে না থাকলেও ব্যবহার করবেন না।
টোবিয়াস ল্যাঙ্গনার

18
Q_UNUSEDনীতিগতভাবে এভাবেই প্রয়োগ করা হয়।
দিমিত্রি ভোলোসনিখ

11
@ ক্যামেরন আপনি সি ++ এ কেবলমাত্র প্যারামিটারের নাম বাদ দিতে পারেন। যদি এটি টেম্পলেটেড হয় তবে এটি সি তে ব্যবহৃত হবে না, সুতরাং আপনার পক্ষে কাস্ট-টু-অকার্যকর কৌশল দরকার নেই।
অ্যালেক্স বি

13
শুধু #define UNUSED(expr) (void)(expr)খুব কাজ করা উচিত (করণীয় না করে)।
জনি জেডি

7
আমি ভাবছি কীভাবে এটি একটি বৈকল্পিক টেম্পলেটটির জন্য করা যায়। ইন template<typename... Args> void f(const Args&... args)আমি লিখতে পারি না (void)args;বা (void)args...;কারণ উভয়ই সিনট্যাক্স ত্রুটি।
পানজী

101

জিসিসি এবং ক্ল্যাং-এ আপনি __attribute__((unused))নিজের লক্ষ্য অর্জনের জন্য প্রিপ্রোসেসর নির্দেশিকা ব্যবহার করতে পারেন ।
উদাহরণ স্বরূপ:

int foo (__attribute__((unused)) int bar) {
   return 0;
}

1
এটি কলব্যাক ফাংশনগুলির জন্য সেরা সমাধান।
সোনিক এটম



39

আপনার বর্তমান সমাধানটি সেরা - আপনি যদি প্যারামিটারের নামটি ব্যবহার না করেন তবে মন্তব্য করুন। এটি সমস্ত সংকলকগুলির ক্ষেত্রে প্রযোজ্য, তাই আপনাকে এটি প্রিসিআর ব্যবহার করে বিশেষত জিসিসির জন্য এটি করতে হবে না।


7
কেবলমাত্র এই উত্তরটি শক্তিশালী করার জন্য - আপনার # আইডিডিএফ লাগবে না, কেবল অব্যবহৃত প্যারামিটারের নামগুলি মন্তব্য করুন।
কুমারানা

4
আমার একটি মামলা রয়েছে যেখানে প্যারামিটারটি কলব্যাকের অংশ এবং এটি মন্তব্য করার ফলে সংকলনটি ভেঙে যায় (সুতরাং আমি কেন g++এটি সম্পর্কে সতর্কতা দিচ্ছি তা নিশ্চিত নয় )) এরকম ক্ষেত্রে, আপনি কী প্রস্তাব করবেন?
ড্র নোকস

1
অব্যবহৃত প্যারামিটারগুলির সাথে একটি ইনলাইন ভার্চুয়াল পদ্ধতিটি কল্পনা করুন / * মন্তব্য করেছেন * /, ইন্টারফেসের ক্লায়েন্ট বেশিরভাগ আইডিইতে স্বতঃপূরণের সময় প্যারামিটারের নামটি দেখতে পাবেন না। এক্ষেত্রে UNUSED () সমাধান কম পরিচ্ছন্ন হলেও বেশি সুবিধাজনক।
cbuchart

আমি মনে করি সহজতর ভাল, মন্তব্য করা খুব পরিষ্কার
fievel

26

সি ++ 17 আপডেট

C ++ 17 আমরা অ্যাট্রিবিউট লাভ [[maybe_unused]] যা আচ্ছাদিত করা হয় [dcl.attr.unused]

বৈশিষ্ট্য-টোকেন হতে পারে_অনুসৃত ইঙ্গিত দেয় যে কোনও নাম বা সত্তা সম্ভবত ইচ্ছাকৃতভাবে অব্যবহৃত। এটি প্রতিটি বৈশিষ্ট্য-তালিকায় একবারে উপস্থিত হবে এবং কোনও অ্যাট্রিবিউট-আর্গুমেন্ট-ধারা উপস্থিত থাকবে না be ...

উদাহরণ:

 [[maybe_unused]] void f([[maybe_unused]] bool thing1,
                        [[maybe_unused]] bool thing2) {
  [[maybe_unused]] bool b = thing1 && thing2;
    assert(b);
 }

এনডিইডিইউবিউ সংজ্ঞায়িত করা হয়েছে কিনা তা বাস্তবায়নগুলি সতর্ক করে দেয় না যে বি অব্যবহৃত। পরবর্তী উদাহরণ]

নিম্নলিখিত উদাহরণের জন্য:

int foo ( int bar) {
    bool unused_bool ;
    return 0;
}

ঝনঝন এবং জিসিসি উভয়ই বার এবং অব্যবহৃত_বুলের জন্য ওয়াল-ওয়েক্সট্রা ব্যবহার করে ডায়াগনস্টিক তৈরি করে ( এটি সরাসরি দেখুন )।

[[সম্ভবত_ অব্যবহৃত]] যুক্ত করার সময় ডায়াগনস্টিকগুলি নিরব করে :

int foo ([[maybe_unused]] int bar) {
    [[maybe_unused]] bool unused_bool ;
    return 0;
}

এটা লাইভ দেখতে পাবেন

সি ++ এর আগে

সি ++ ১১ -এ অব্যবহৃত ভেরিয়েবলের ক্যাপচারের সাথে UNUSEDল্যাম্বডা এক্সপ্রেশন ( বেন ডিনের মাধ্যমে ) ব্যবহার করে ম্যাক্রোর একটি বিকল্প রূপ তৈরি করা যেতে পারে :

#define UNUSED(x) [&x]{}()

লাম্বডা অভিব্যক্তিটির তাত্ক্ষণিকভাবে অনুরোধটি নীচের উদাহরণের সাথে মিলিয়ে অপ্টিমাইজ করা উচিত:

int foo (int bar) {
    UNUSED(bar) ;
    return 0;
}

আমরা গডবোল্টে দেখতে পাচ্ছি যে কলটি আশাবাদী হয়ে গেছে away

foo(int):
xorl    %eax, %eax
ret

5
সুতরাং আপনি সি ++ 11 উল্লেখ করেছেন এবং তারপরে ম্যাক্রো উপস্থাপনের জন্য পরিচালনা করবেন ?! সেকি! সম্ভবত একটি ফাংশন ব্যবহার ক্লিনার হবে? template <class T> inline void NOTUSED( T const & result ) { static_cast<void>(result); }আমি মনে করি আপনি ফাংশনে ল্যাম্বডা ব্যবহার করতে পারেন।
অ্যালেক্সিস উইলক

গডবোল্ট একটি দুর্দান্ত সংস্থান
ইয়ানো

5
[&x]{}()সতর্কতাটি সত্যই নিরব করে না, পরিবর্তে কলার ফাংশন থেকে ল্যাম্বডায় সতর্কতাটি উত্তোলন করে। কম্পাইলাররা এটি একটি সতর্কবার্তা হিসাবে সনাক্ত না হওয়া পর্যন্ত সময় লাগবে, তবে ঝাঁকুনি গোছানো ইতিমধ্যে ক্যাপচার তালিকায় একটি অব্যবহৃত পরিবর্তনশীল সম্পর্কে অভিযোগ করে।
এনভিএক্সএক্স

25

একটি পরিষ্কার উপায় হ'ল কেবল পরিবর্তনশীল নামগুলি মন্তব্য করা:

int main(int /* argc */, char const** /* argv */) {
  return 0;
}

8
আপনার অক্সিজেন থাকলে এবং পরামিতিগুলি নথি করতে চান তবে এটি ভাল নয়।
অ্যালেক্সিস উইল্কে 2:44

18
@ অ্যালেক্সিসওয়িল্ক: এটি ডক্সিজেনের বাগ হিসাবে যোগ্যতা অর্জন করবে, আইএমও
6502

3
আপনি #ifdef DOXYGEN- এ শর্তসাপেক্ষে আপনার নিজের_প্রোজেজT_UNUSED (আরগনাম) নির্ধারণ করতে পারেন যাতে ডোজিজেন নামটি দেখতে পারে এবং প্রকৃত সংকলকটি ইন্ট্রেন মেইন (int YOUR_PROJECT_UNUSED (আরজিসি), ...) এর মাধ্যমে না পারে। কল্পিত নয়, তবে কাজ করে।
mabraham 13

এ জাতীয় অনেক নেস্টেড মন্তব্য সহ কোডের একটি ব্লক মন্তব্য করা আমার পক্ষে খুব বেদনাদায়ক বলে মনে হচ্ছে। (সংকলক প্রতিটি সম্পর্কে অভিযোগ করে)।
জেফ ম্যাকক্লিনটক

@ জেফএমসি ক্লিন্টক কেবলমাত্র একক লাইনের মন্তব্য ব্যবহার করুন। বেশিরভাগ ভদ্র সম্পাদকরা উল্লম্ব ব্লক সম্পাদনা সমর্থন করে (যেমন [সিএমটিআরএল] + ভিমে ভি [ভি))। অন্যথায়, #if 0 / #endifব্লক মন্তব্য ব্যবহার করুন ।
রুসলান

24

সহকর্মীকে শুধু এই চমৎকার সামান্য ম্যাক্রো আমাকে ইশারা এখানে

স্বাচ্ছন্দ্যের জন্য আমি নীচে ম্যাক্রো অন্তর্ভুক্ত করব।

#ifdef UNUSED
#elif defined(__GNUC__) 
# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) 
#elif defined(__LCLINT__) 
# define UNUSED(x) /*@unused@*/ x 
#else 
# define UNUSED(x) x 
#endif

void dcc_mon_siginfo_handler(int UNUSED(whatsig))

12
"দুর্দান্ত" "ম্যাক্রো" "সি ++" - চয়ন করুন ২
জেফ ম্যাকক্লিন্টক

23

এই সতর্কতাগুলি ডিফল্টভাবে ফ্ল্যাগ করে না। এই সতর্কতাটি স্পষ্টরূপে -Wunused-parameterসংকলকটি প্রেরণ করে বা সুস্পষ্টভাবে পাস -Wall -Wextra(অথবা সম্ভবত পতাকাগুলির কিছু সংমিশ্রণ) দ্বারা চালু করা উচিত ছিল।

অব্যবহৃত প্যারামিটার সতর্কতাগুলি কেবল -Wno-unused-parameterকম্পাইলারে যাওয়ার মাধ্যমে দমন করা যেতে পারে, তবে নোট করুন যে এই অক্ষমকারী পতাকাটি অবশ্যই কম্পাইলার কমান্ড লাইনে এই সতর্কতার জন্য কোনও সম্ভাব্য পতাকাগুলি সক্রিয় করার পরে আসতে হবে, যাতে এটি কার্যকর হতে পারে।


2
যদিও, এই প্রশ্নের সেরা উত্তর নাও হতে পারে (কারণ প্রশ্নটি কীভাবে সতর্কতা এড়ানো যায়, কীভাবে এটি নিষ্ক্রিয় করা যায় না), এই উত্তরটি গুগল থেকে আসা লোকেরা হতে পারে (আমার মতো) কীভাবে অনুসন্ধান করেছিল ("কীভাবে এই সতর্কতাটি অক্ষম করতে ")। তাই আমি +1 দিচ্ছি, আপনার উত্তরের জন্য ধন্যবাদ!
মোজব্বুজ

13

এক বা একাধিক পরামিতি অব্যবহৃত হিসাবে ঘোষণার জন্য ম্যাক্রো-কম এবং বহনযোগ্য উপায় :

template <typename... Args> inline void unused(Args&&...) {}

int main(int argc, char* argv[])
{
    unused(argc, argv);
    return 0;
}

খুব ভাল, তবে মনে রাখবেন যে এর জন্য সি ++ 11 প্রয়োজন (বা অবশ্যই আরও নতুন)।
পল আর

আমি এই উত্তরটি নীচে দিয়েছি কারণ আমি কেবল সতর্কতা থেকে মুক্তি পেতে সংকলনের সময় (টেম্পলেট ব্যবহার করে) উত্সর্গ করতে চাই না।
কনরাড ক্লাইন

@ কনরাডক্লাইন: সম্ভবত এটি কতটা সঙ্কলিত সময় ব্যয় করতে পারে? আমার কম্পিউটারে পরীক্ষা করে, আমি দ্বিতীয়টির দশমাংশে এই হাজার হাজার অব্যবহৃত () কল কার্যকর করতে পারি।
ড্যানিয়েল ম্যাকলারি 18

@ ড্যানিয়েলএমসি লৌরি এটি কেবল আমার অনুমান এবং আমি কোনও পরীক্ষা-নিরীক্ষা করিনি।
কনরাড ক্লাইন

8

প্রিপ্রসেসর নির্দেশাবলী ব্যবহার করা বেশিরভাগ সময় মন্দ হিসাবে বিবেচিত হয়। আদর্শভাবে আপনি তাদের কীটপতঙ্গের মতো এড়াতে চান। মনে রাখবেন যে আপনার কোডটি সংকলকটি বোঝা সহজ করা সহজ, অন্য প্রোগ্রামারদের আপনার কোড বোঝার সুযোগ দেওয়া আরও শক্ত much এখানে এবং এর মতো কয়েক ডজন কেস পরে নিজের জন্য বা অন্যের জন্য এই মুহুর্তে পড়া খুব কঠিন করে তোলে।

একটি উপায় হতে পারে আপনার প্যারামিটারগুলি একসাথে কোনও ধরণের আর্গুমেন্ট ক্লাসে রেখে দেওয়া। তারপরে আপনি কেবল ভেরিয়েবলগুলির কেবলমাত্র একটি উপসেট ব্যবহার করতে পারেন (প্রতিটি আপনার প্ল্যাটফর্মের জন্য 0 সত্যিই বরাদ্দ করার সমতুল্য) বা প্রতিটি প্ল্যাটফর্মের জন্য সেই যুক্তি শ্রেণীর বিভিন্ন বিশেষত্ব থাকতে পারে। এটি তবে এটির পক্ষে উপযুক্ত নাও হতে পারে, এটি আপনার মাপসই হবে কিনা তা বিশ্লেষণ করতে হবে।

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


5
"প্রিপ্রোসেসর নির্দেশিকা ব্যবহার করা বেশিরভাগ সময় মন্দ হিসাবে বিবেচিত হয়।" সত্যি? কার দ্বারা?
গ্রীম পেরো

12
যে কেউ সুযোগের বিষয়ে চিন্তা করে, সঠিকভাবে ডিবাগ করতে সক্ষম হচ্ছেন বা তাদের বিবেকহীন By
বিল

2
@ গ্র্যাম, এটি নিষ্পাপ দেখায় যখন আমরা কেবল এর চারটি লাইন দেখতে পাই তবে চারদিকে ছড়িয়ে পড়লে মাথা ব্যথার কারণ হয় না। #ifdef মূলত আপনাকে এমন উত্স কোডের একাধিক সংস্করণ রাখতে দেয় যার সংকলকটি কেবল একটি দেখতে পাবে। বিলের উল্লেখ অনুসারে, এটি ডিবাগ করাও আরও কঠিন করে তোলে। আমি বিভিন্ন বই এবং ব্লগে প্রিপ্রোসেসর নির্দেশিকাগুলির দুষ্টতা সম্পর্কে পড়েছি এবং পাশাপাশি এটি নিজেও অভিজ্ঞতা অর্জন করেছি। অবশ্যই সব কিছু আপেক্ষিক। কখনও কখনও প্রিপ্রোসেসর নির্দেশিকা কেবল সহজভাবে বোঝায় কারণ অন্য যে কোনও কিছুর খারাপ পরিণতি ঘটতে পারে এবং আমার বক্তব্যটি এখানে কেবলমাত্র যেখানে সম্ভব সেখানে এড়ানো উচিত।
বেন দাদসেটান

1
অতিরিক্ত ব্যবহার খারাপ, তবে আমি #define UNUSED(expr) (void)(expr)উপযুক্ত বলব would
জনি জেডি

7

প্রথমে সতর্কতা উত্স ফাইলে পরিবর্তনশীল সংজ্ঞা দ্বারা উত্পাদিত হয় শিরোনাম ফাইল নয়। শিরোনামটি আধ্যাত্মিক থাকতে পারে এবং হওয়া উচিত, যেহেতু আপনি সম্ভবত API- ডকুমেন্টেশন তৈরি করতে ডক্সিজেনের মতো কিছু ব্যবহার করছেন।

আমি ধরে নেব যে উত্স ফাইলগুলিতে আপনার সম্পূর্ণ ভিন্ন প্রয়োগ রয়েছে। এই ক্ষেত্রে আপনি আপত্তিকর প্যারামিটারটি মন্তব্য করতে পারেন বা কেবলমাত্র পরামিতিটি লিখতে পারেন।

উদাহরণ:

func(int a, int b)
{
    b;
    foo(a);
}

এটি রহস্যজনক বলে মনে হতে পারে, সুতরাং এটি ইউএসএসএডের মতো ম্যাক্রো সংজ্ঞায়িত করা হয়েছে। এমএফসি যেভাবে এটি করেছে তা হ'ল:

#ifdef _DEBUG
#define UNUSED(x)
#else
#define UNUSED(x) x
#endif

এটির মতো আপনি সতর্কতাটি ডিবাগ বিল্ডগুলিতে এখনও দেখতে পান, সহায়ক হতে পারে।


4

প্যারামিটারের নামগুলি সর্বদা মন্তব্য করা কি নিরাপদ নয়? যদি তা না হয় তবে আপনি এর মতো কিছু করতে পারেন

#ifdef _MSC_VER
# define P_(n) n
#else
# define P_(n)
#endif

void ProcessOps::sendToExternalApp(
    QString sAppName, QString sImagePath,
    qreal P_(qrLeft), qreal P_(qrTop), qreal P_(qrWidth), qreal P_(qrHeight))

এটি কিছুটা কুরুচিপূর্ণ।


4
পরম নামটি C ++ এ বাধ্যতামূলক নয় - এটি সিতে রয়েছে - এই সতর্কতাটি রোধ করার জন্য একটি স্ট্যান্ডার্ড এবং সহজ উপায় দেওয়া।
এপ্রোগ্রামার

1
@ হ্যাকার, কখনও বলেনি যে এটি ছিল। আমি সি এবং সি ++ এর মধ্যে পার্থক্যগুলি চিহ্নিত করতে চাই, বিশেষত যখন তারা এমন অঞ্চলে থাকে যা আপনি সাধারণ উপসেট বলে মনে করেন ... কেবল একটি অভ্যাস কারণ আমি মিশ্র কোড বেসে কাজ করছি।
এপ্রোগ্রামার

4

আমি (void)param2সতর্কবার্তাটি চুপ করে যাওয়ার পরিবর্তে এটি দেখেছি :

void foo(int param1, int param2)
{
    std::ignore = param2;
    bar(param1);
}

দেখে মনে হচ্ছে এটি সি ++ 11 এ যুক্ত হয়েছিল


মনে হচ্ছে এটি কিছু করছে, সংকলনের পরে অবহেলা করা হচ্ছে না।
GyuHyeon Choi

3

একটি ব্যবহার করে UNREFERENCED_PARAMETER(p)কাজ করতে পারে। আমি জানি এটি উইন্ডোজ সিস্টেমগুলির জন্য উইনএনটি.চ. তে সংজ্ঞায়িত হয়েছে এবং সহজেই জিসিসির জন্য এটি সংজ্ঞায়িত করা যেতে পারে (যদি এটি ইতিমধ্যে এটি না থাকে)।

UNREFERENCED PARAMETER(p) হিসাবে সংজ্ঞায়িত করা হয়

#define UNREFERENCED_PARAMETER(P)          (P)

WinNT.h এ।


2

সংকলকের পতাকা ব্যবহার করুন, যেমন জিসিসির জন্য পতাকা: -Wno-unused-variable


1

আপনি __unusedসংকলকটি বলতে এটি ব্যবহার করতে পারেন যে ভেরিয়েবল ব্যবহার করা যেতে পারে না।

- (void)myMethod:(__unused NSObject *)theObject    
{
    // there will be no warning about `theObject`, because you wrote `__unused`

    __unused int theInt = 0;
    // there will be no warning, but you are still able to use `theInt` in the future
}

2
কোন সংকলক? কারণ __unusedস্ট্যান্ডার্ড সি ++ নয় এবং আরও কিছু বিষয়, আপনি যা পোস্ট করেছেন তাও নয় ... এটি উদ্দেশ্য-সি। তাই এই উত্তর শুধুমাত্র নির্দিষ্ট কম্পাইলার (গুলি) জন্য সত্যিই দরকারী, এবং এটা কোড অ পোর্টেবল তোলে, এবং আসলে ব্যবহারকারী কোড যেহেতু সত্যিই বৈধ নয় সঙ্গে আরম্ভ ব্যবহার শনাক্তকারী বোঝানো হয় না __, যা বাস্তবায়ন জন্য সংরক্ষিত।
আন্ডারস্কোর_

1

সি ++ 11 এ, আমি যে সমাধানটি ব্যবহার করছি তা এটি:

template<typename... Ts> inline void Unreferenced(Ts&&...) {}

int Foo(int bar) 
{
    Unreferenced(bar);
    return 0;
}

int Foo2(int bar1, int bar2) 
{
    Unreferenced(bar1, bar2);
    return 0;
}

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

অতিরিক্ত কোড যদি কোনও সমস্যা হয় তবে আপনি এই ঘোষণাটি পরিবর্তে ব্যবহার করতে পারেন:

(decltype(Unreferenced(bar1, bar2)))0;

তবে সেই মুহুর্তে, একটি ম্যাক্রো আরও ভাল পঠনযোগ্যতা সরবরাহ করে:

#define UNREFERENCED(...) { (decltype(Unreferenced(__VA_ARGS__)))0; }

1

এটি ভালভাবে কাজ করে তবে সি ++ 11 প্রয়োজন

template <typename ...Args>
void unused(Args&& ...args)
{
  (void)(sizeof...(args));
}

1
এটি সম্পর্কে কী C ++ 14 প্রয়োজন এবং সি ++ 11 এ কাজ করবে না? আমি কিছুই দেখতে পাচ্ছি না। এছাড়াও, ALLCAPSম্যাক্রো ব্যতীত অন্য যে কোনও কিছুর জন্য এটি ব্যবহার করা নিরুৎসাহিত করা হয় , যা এগুলিকে অশুভ এবং অযাচিত দেখায়, তবে এ সম্পর্কে খারাপ কিছু নেই, সত্যিই এটি বাদ দিয়ে static_castভাল লাগবে।
আন্ডারস্কোর_

0

আমি উপস্থাপিত উত্তরগুলির বেশিরভাগই কেবল স্থানীয় অব্যবহৃত ভেরিয়েবলের জন্য কাজ করেছি এবং অব্যবহৃত স্থিত বৈশ্বিক চলকের জন্য সংকলন ত্রুটির কারণ ঘটাব।

অব্যবহৃত স্ট্যাটিক গ্লোবাল ভেরিয়েবলের সতর্কতা দমন করার জন্য আরেকটি ম্যাক্রোর প্রয়োজন।

template <typename T>
const T* UNUSED_VARIABLE(const T& dummy) { 
    return &dummy;
}
#define UNUSED_GLOBAL_VARIABLE(x) namespace {\
    const auto dummy = UNUSED_VARIABLE(x);\
}

static int a = 0;
UNUSED_GLOBAL_VARIABLE(a);

int main ()
{
    int b = 3;
    UNUSED_VARIABLE(b);
    return 0;
}

এটি কাজ করে কারণ বেনামে নেমস্পেসে অ স্থিত গ্লোবাল ভেরিয়েবলের জন্য কোনও সতর্কতার খবর দেওয়া হবে না।

যদিও সি ++ 11 প্রয়োজনীয়

 g++  -Wall -O3  -std=c++11 test.cpp

0

হাঃ হাঃ হাঃ! আমি ভাবি না যে এসও-তে আরও একটি প্রশ্ন রয়েছে যা চাওসের দ্বারা দূর্গিত সমস্ত ধর্মাবলম্বী এইটিকে আরও ভাল করে প্রকাশ করে!

সি ++ 17 এর প্রতি যথাযথ সম্মানের সাথে সি ++ কোর নির্দেশিকাগুলিতে একটি স্পষ্ট গাইডলাইন রয়েছে । আফার, ২০০৯ সালে আজও এই বিকল্পটি ছিল। এবং যদি কেউ বলে যে এটি ডোজিনে একটি বাগ হিসাবে বিবেচিত হয় তবে ডক্সিনে একটি বাগ রয়েছে


-14

আমি আপনার সমস্যাটি সতর্কতার সাথে দেখছি না। এটি পদ্ধতি / ফাংশন শিরোনামে এটি নথি করুন যে সংকলক xy এখানে একটি (সঠিক) সতর্কতা জারি করবে, তবে প্ল্যাটফর্ম z এর জন্য এইগুলি পরিবর্তনশীলগুলির প্রয়োজন।

সতর্কতাটি সঠিক, এটিকে বন্ধ করার দরকার নেই। এটি প্রোগ্রামটিকে অকার্যকর করে না - তবে এটি নথিভুক্ত করা উচিত, এর কোনও কারণ আছে।


20
সমস্যাটি হ'ল, যদি আপনার কাছে কয়েকশ বা হাজার হাজার সতর্কতা থাকে তবে আপনি এটি কার্যকর যেটিকে মিস করতে পারেন। (দু'বার আমি কয়েক হাজার সতর্কবার্তাটি সরিয়ে ফেলতে, বেশিরভাগকে মুছে ফেলার মতো পরিস্থিতি ছিলাম এবং গুরুতর ত্রুটিগুলির ইঙ্গিত দিয়েছিল এমন কয়েকবার সত্যিই দরকারী বলে মনে করি।) সর্বোচ্চ সতর্কতার স্তরে যদি সম্ভব হয় তবে সতর্কতা ছাড়াই সংকলন করা সর্বদা ভাল।
এসবিআই

4
একটি প্রকল্পে আমি গত বছর কাজ করেছি আমি সর্বাধিক সতর্কতা স্তর চালু করেছি এবং 10,000 ডলার সতর্কতা পেয়েছি। মাত্র কয়েক ডজন সত্যই সহায়ক ছিল। এগুলির মধ্যে প্রায় এক ডজন সত্যই বাজে বাগগুলি লুকানো ছিল, তবে কোড বেসটি এমন পর্যায়ে পরিষ্কার করতে বেশ কয়েক সপ্তাহ সময় লেগেছে যেখানে কেউ আসলে কয়েকটি গুরুতর বিষয় দেখতে পেত । সতর্কতা স্তরটি যদি সর্বদা অবধি থাকে এবং কোড বেসটি সতর্কতা-মুক্ত রাখা থাকে তবে এই ত্রুটিগুলি কখনই কোডের মধ্যে প্রবেশ করত না।
এসবিআই

1
দুঃখিত - তবে প্রকল্পটির দেরিতে স্ট্যাটিক কোড বিশ্লেষণ (আপনার উপলব্ধ যে কোনও সরঞ্জাম ব্যবহার করে, এমনকি এটি কেবল সংকলক হলেও) পুরো প্রোগ্রামটি প্রোগ্রামিংয়ের মতো কিছুটা এবং যখন আপনি শেষ করেন, কম্পাইলটি টিপুন এবং আশা করুন যে আপনার কোনও ত্রুটি নেই।
টোবিয়াস ল্যাঙ্গনার

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

2
@ এসবিআই: আপনার সংকলকটির জন্য সর্বোচ্চ সতর্কতার স্তরে টুরিং করা স্ট্যাটিক কোড বিশ্লেষণের কিছু ফর্ম। স্ট্যাটিক কোড বিশ্লেষণ কেবল কোডটি সম্পাদন না করে এবং এ থেকে তথ্য কেটে না নিয়ে কেবল পঠন। সতর্কবাণীগুলির জন্য তার বিধিগুলি পরীক্ষা করে সংকলক ঠিক সেটাই করে।
টোবিয়াস ল্যাঙ্গনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.