সি তে "অব্যবহৃত প্যারামিটার" সতর্কতাগুলি কীভাবে দমন করবেন?


210

এই ক্ষেত্রে:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

সি ++ এ আমি /*...*/পরামিতিগুলির চারপাশে একটি মন্তব্য রাখতে সক্ষম হয়েছি । তবে সি তে অবশ্যই নয়, যেখানে এটি আমাকে ত্রুটি দেয় error: parameter name omitted



4
@ সিরোস্যান্টিলি এই প্রশ্নের আরও উত্সাহ রয়েছে, অন্য প্রশ্নটিকে নকল হিসাবে চিহ্নিত করা ভাল be
সাশোলাম


-Wno-unused-parameter, এটি কেবল খুব গোলমাল এবং খুব কমই বাগ এনএসপি ধরে। কখন -Wshadowব্যবহৃত হয়
Trass3r

উত্তর:


297

আমি সাধারণত এ জাতীয় ম্যাক্রো লিখি:

#define UNUSED(x) (void)(x)

আপনি আপনার সমস্ত অব্যবহৃত প্যারামিটারগুলির জন্য এই ম্যাক্রোটি ব্যবহার করতে পারেন। (দ্রষ্টব্য যে এটি যে কোনও সংকলকটিতে কাজ করে))

উদাহরণ স্বরূপ:

void f(int x) {
    UNUSED(x);
    ...
}

45
আমি কেবল সরাসরি (অকার্যকর) এক্স ব্যবহার করি
অধ্যাপক ফ্যালকেন

6
যদিও এটি আফিকের একমাত্র পোর্টেবল উপায়, এর সাথে বিরক্তি হ'ল এটি যদি ভেরিয়েবলটি পরে ব্যবহার করে এবং অব্যবহৃত লাইনটি মুছে ফেলা ভুলে যায় তবে এটি বিভ্রান্তিকর হতে পারে। এ কারণেই জিসিসির অব্যবহৃত চমৎকার।
ধারণাগুলি 42

6
@ কুকশেলিং: আহ তবে আপনার এটিকে ব্যবহার করা উচিত নয়। ভালো কিছু না: void f(int x) {UNUSED(x);}
চাকরি

9
@ অ্যালকোট কারণ (আমার ক্ষেত্রে হিসাবে) ফাংশনটি এমন অনেকের মধ্যে একটি হতে পারে যা একই স্বাক্ষর থাকতে পারে কারণ তারা ফাংশন পয়েন্টার দ্বারা রেফারেন্স করা হয়।
জোশ

17
আমি ব্যবহার করছি #define UNUSED(...) (void)(__VA_ARGS__)যা আমাকে একাধিক ভেরিয়েবলে এটি প্রয়োগ করতে দেয়।
ম্যাথু মিচেল

110

জিসিসি-তে আপনি unusedবৈশিষ্ট্যটি সহ প্যারামিটারটি লেবেল করতে পারেন ।

এই বৈশিষ্ট্যটি, একটি ভেরিয়েবলের সাথে সংযুক্ত, এর অর্থ হল ভেরিয়েবলটি সম্ভবত অব্যবহৃত। জিসিসি এই পরিবর্তনশীলটির জন্য কোনও সতর্কতা তৈরি করবে না।

অনুশীলনে __attribute__ ((unused))প্যারামিটারের ঠিক সামনে রেখে এটি সম্পন্ন হয় । উদাহরণ স্বরূপ:

void foo(workerid_t workerId) { }

হয়ে

void foo(__attribute__((unused)) workerid_t workerId) { }

24
আমার মতো যে কোনও নবজাতকের পক্ষে এর অর্থ __attribute__ ((unused))যুক্তির সামনে রাখা putting
জোশ

2
@ জোসচ আমি মনে করি আপনি সম্পূর্ণ সঠিক, তবে ডকুমেন্টেশনটি বোঝায় যে এটি প্যারামিটারের পরে রাখা উচিত । উভয় বিকল্প সম্ভবত সমস্যা ছাড়াই সমর্থিত।
আন্তোনিও

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

58

আপনি জিসিসি / ক্ল্যাংয়ের অব্যবহৃত বৈশিষ্ট্যটি ব্যবহার করতে পারেন, তবে সমস্ত উত্স জুড়ে জিসিসি নির্দিষ্ট বৈশিষ্ট্যগুলি এড়াতে আমি এই ম্যাক্রোগুলি একটি শিরোনামে ব্যবহার করি, __attribute__সর্বত্র থাকাও কিছুটা ভার্জোজ / কুরুচিপূর্ণ।

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif

#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

তাহলে আপনি করতে পারেন ...

void foo(int UNUSED(bar)) { ... }

আমি এটিকে পছন্দ করি কারণ আপনি কোডটিতে barকোথাও ব্যবহার করার চেষ্টা করলে আপনি একটি ত্রুটি পান যাতে আপনি ভুল করে এট্রিবিউটটি ছেড়ে যেতে না পারেন।

এবং কার্যাদি জন্য ...

static void UNUSED_FUNCTION(foo)(int bar) { ... }

দ্রষ্টব্য 1):
আমি যতদূর জানি, এমএসভিসির সমতুল্য নেই __attribute__((__unused__))

নোট 2): ম্যাক্রো আর্গুমেন্ট যা প্রথম বন্ধনী থাকে, জন্য কাজ করবে না তাই আপনি যদি একটি আর্গুমেন্ট মত আছে আপনি করতে পারবেন না না, বা এই শুধুমাত্র downside হয় ম্যাক্রো আমি এতদূর পাওয়া যায় নি, এই ক্ষেত্রে আমি ফিরে পড়া প্রতি
UNUSED
float (*coords)[3]
float UNUSED((*coords)[3])float (*UNUSED(coords))[3]UNUSED(void)coords;


অথবা হতে পারে কেবল #define __attribute__(x)নন-জিসিসি পরিবেশের জন্য ( __attribute__এএফআইএকিগুলির কোনওটিই এমএসভিসি দ্বারা সমর্থিত নয়)?
ফ্র্যাঙ্কলিন ইউ

এটি কাজ করতে পারে, তবে ডেনার প্রিফিক্সড শর্তাদি সংকলকের জন্য সংরক্ষিত রয়েছে তাই আমি এটি এড়াতে চাই না।
ধারণাগুলি 42

আমার জিসিসি-র জন্য অন্তত শনাক্তকারীকে ফানকস, ওয়ার্স এবং প্যারামিটারের জন্য সঠিকভাবে কাজ করার আগে বিশিষ্টতা নির্দিষ্টকরণকারী স্থাপন করা, তাই # ডিফাইন পসসিবিএলইউএনইউএসইডি (শনাক্তকারী) বৈশিষ্ট্য __ ((__ অব্যবহৃত )) সনাক্তকারীর মতো তিনটিই ব্যবহার করা যেতে পারে
ব্রিটন কেরিন

আমি পাওয়ার পরে এটি রাখার সময় warning: unused parameter ‘foo’ [-Wunused-parameter](gcc 7.3.0)
ধারণাগুলি 42

19

অব্যক্ত বৈশিষ্ট্য সহ জিসিসি সহ:

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

16

এটি জিসিসি হিসাবে চিহ্নিত হয়েছে তা দেখে আপনি কমান্ড লাইন সুইচটি ব্যবহার করতে পারেন Wno-unused-parameter

উদাহরণ স্বরূপ:

gcc -Wno-unused-parameter test.c

অবশ্যই এটি পুরো ফাইলটিকে প্রভাবিত করে (এবং আপনি যেখানে সুইচটি সেট করেছেন সেখানে নির্ভর করে এমন প্রকল্প) তবে আপনাকে কোনও কোড পরিবর্তন করতে হবে না।


7

সোর্স কোডের একটি ব্লকের অব্যবহৃত প্যারামিটার সতর্কতা দমন করার জন্য একটি জিসিসি / জি ++ নির্দিষ্ট উপায় হ'ল এটি নিম্নোক্ত প্রগমা বিবৃতি সহ বন্ধ করা:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop


4

বৈশিষ্ট্যটি লেবেল করা আদর্শ উপায়। ম্যাক্রো কিছু সময় বিভ্রান্তির দিকে নিয়ে যায়। এবং অকার্যকর (এক্স) ব্যবহার করে, আমরা প্রক্রিয়াকরণে একটি ওভারহেড যুক্ত করছি।

যদি ইনপুট আর্গুমেন্ট ব্যবহার না করে তবে ব্যবহার করুন

void foo(int __attribute__((unused))key)
{
}

যদি ফাংশনের ভিতরে সংজ্ঞায়িত ভেরিয়েবল ব্যবহার না করে

void foo(int key)
{
   int hash = 0;
   int bkt __attribute__((unused)) = 0;

   api_call(x, hash, bkt);
}

এখন পরে আপনার লজিকের জন্য হ্যাশ ভেরিয়েবল ব্যবহার করে তবে বিকেটির দরকার নেই। বিকেটকে অব্যবহৃত হিসাবে সংজ্ঞায়িত করুন, অন্যথায় সংকলক''bkt সেট বিটি ব্যবহার করেননি "।

দ্রষ্টব্য: এটি কেবলমাত্র সতর্কতা দমন করার জন্য নয় অপ্টিমাইজেশনের জন্য।


1
আপনি ব্যবহার করে প্রসেসিংয়ে কোনও ওভারহেড যুক্ত করবেন না void(x), সংকলক এটিটিকে অপ্টিমাইজ করবে।
মাজোরা 320

4

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

এটার মত

test.cpp: 29: 11: সতর্কতা: ভেরিয়েবল 'ম্যাজিক' সেট কিন্তু ব্যবহার করা হয়নি [-উনউজড-কিন্তু-সেট-ভেরিয়েবল] শর্ট ম্যাজিক [] = {

test.cpp: 84: 17: সতর্কতা: অব্যবহৃত ভেরিয়েবল 'বিফোর_রাইট' [-উক্ত-ব্যবহারযোগ্য ভেরিয়েবল] int64_t এর আগে_আরাইট = থ্রেড :: কারেন্টটাইমমিলিস ();

সুতরাং সমাধান বেশ পরিষ্কার। -Wno-unusedসিসিএফএলজি জিসিসি / ঝনঝন হিসাবে যুক্ত করা সমস্ত "অব্যবহৃত" সতর্কতাগুলি দমন করবে, এমনকি আপনি -Wallনির্ধারণ করেছেনও ।

এইভাবে, আপনাকে কোনও কোড পরিবর্তন করার দরকার নেই।


1
আপনি যদি সমস্ত অব্যবহৃত সতর্কতাগুলি সত্যই উপেক্ষা করতে চান তবে এটি ঠিক আছে, তবে এটি প্রায়শই ঘটে না। এটি সাধারণত সুনির্দিষ্ট নির্দিষ্ট দৃষ্টান্ত যা আপনি উপেক্ষা করতে চান।
ড্যান বেচার্ড

1

এমএসভিসিতে একটি নির্দিষ্ট সতর্কতা দমন করতে এটি / wd # হিসাবে সংকলক করার জন্য এটির নম্বর উল্লেখ করা যথেষ্ট। আমার সিএমকেলিস্ট.টেক্সটে এই জাতীয় ব্লক রয়েছে:

If (MSVC)
    Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
    Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
    Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
    Add_definitions (-Wall -W -pedantic)
Else ()
    Message ("Unknown compiler")
Endif ()

এখন আমি ঠিক কীভাবে বলতে পারি না / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127 এর অর্থ, কারণ আমি তিন বছর ধরে এমএসভিসির দিকে কোন মনোযোগ দিই না, তবে তারা সুপারপেনডেন্টিক সতর্কতাগুলি দমন করে যা ফলাফলকে প্রভাবিত করে না।


0

আমি এই শৈলীটি ব্যবহৃত হচ্ছে দেখেছি:

if (when || who || format || data || len);

14
হুঁ। আমি এটি পছন্দ করতে পারি তা বলতে পারি না, কারণ এটি ধরে নিয়েছে যে জড়িত সমস্ত পরামিতিগুলিকে একটি বিলে রূপান্তর করা যায়।
সুমা

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

1
আমি বিশ্বাস করতে পারি না আমি এখনও এর উত্তর পেয়েছি। প্রশ্নটি বলেছিল যে এটি সি এর জন্য ছিল, হ্যাঁ, অন্য ভাষায় এটি কাজ করবে না।
ইস্তিন

2
আমি নতুনত্বের উপাদানটির জন্য এটি +1 না করে ব্যবহার করব না।
মগলগগুলি

2
ভেরিয়েবলের সত্যতা পরীক্ষা করা স্ট্রাইকগুলির জন্য সতর্কতা দিতে পারে। যেমন। struct { int a; } b = {1}; if (b);জিসিসি সতর্ক করেছে used struct type value where scalar is required,।
ধারণাগুলি 42

-1

রেকর্ডের জন্য, আমি উপরে জবের উত্তর পছন্দ করি তবে আমি একটি "ডু-কিছুই" বিবৃতিতে ভেরিয়েবলের নামটি নিজেই ব্যবহার করে একটি সমাধান সম্পর্কে আগ্রহী:

void foo(int x) {
    x; /* unused */
    ...
}

অবশ্যই, এটির ঘাটতি রয়েছে; উদাহরণস্বরূপ, "অব্যবহৃত" নোট ব্যতীত কোডের ইচ্ছাকৃত লাইনটির চেয়ে ভুল বলে মনে হয়।

সুবিধাটি হ'ল কোনও ডিফাইন দরকার হয় না এবং এটি সতর্কতা থেকে মুক্তি পায়।

কোনও পারফরম্যান্স, অপটিমাইজেশন, বা অন্যান্য পার্থক্য আছে?


2
আমি হয় এটি এমএসভিসির সাথে ব্যবহার করেছি, তবে জিসিসি "প্রভাব ছাড়াই বিবৃতি" উত্থাপন করে। সুতরাং, কাজের সমাধানটি যাওয়ার উপায়।
দিমিত্রি সেমিকিন

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