सी में "अप्रयुक्त पैरामीटर" चेतावनियों को कैसे दबाएं?


210

उदाहरण के लिए:

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

सी ++ में मैं /*...*/मापदंडों के आसपास एक टिप्पणी डालने में सक्षम था । लेकिन सी के पाठ्यक्रम में नहीं, जहां यह मुझे त्रुटि देता है error: parameter name omitted



4
@CiroSantilli इस प्रश्न में अधिक अपवित्रता है, दूसरे प्रश्न को डुप्लिकेट के रूप में चिह्नित करना बेहतर होगा।
शशोअल्म


-Wno-unused-parameter, यह सिर्फ शोर है और शायद ही कभी कीड़े esp पकड़ता है। जब -Wshadowप्रयोग किया जाता है।
Trass3r

जवाबों:


297

मैं आमतौर पर इस तरह एक मैक्रो लिखता हूं:

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

आप अपने सभी अप्रयुक्त मापदंडों के लिए इस मैक्रो का उपयोग कर सकते हैं। (ध्यान दें कि यह किसी भी संकलक पर काम करता है।)

उदाहरण के लिए:

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

45
मैं सीधे (शून्य) x का उपयोग करता हूं
प्रो। फॉकन

6
जबकि यह एकमात्र पोर्टेबल तरीका है AFAIK, इस के साथ झुंझलाहट यह है कि यह भ्रामक हो सकता है यदि आप बाद में चर का उपयोग करते हैं और रो को अप्रयुक्त पंक्ति को भूल जाते हैं। यही कारण है कि जीसीसी का अप्रयुक्त उपयोग अच्छा है।
सुविचार ४२

6
@CookSchelling: आह, लेकिन आप इसे इस तरह का उपयोग नहीं करना चाहिए। कुछ इस तरह से करें void f(int x) {UNUSED(x);}:।
जॉब

9
@Alcott क्योंकि (मेरे मामले में) फ़ंक्शन कई में से एक हो सकता है जिनके पास एक ही हस्ताक्षर होना चाहिए क्योंकि वे फ़ंक्शन पॉइंटर द्वारा संदर्भित होते हैं।
जॉस

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))तर्क के सामने रखना है।
जॉस

2
@ जोश मुझे लगता है कि आप पूरी तरह से सही हैं, लेकिन प्रलेखन का मतलब यह है कि इसे पैरामीटर के बाद रखा जाना चाहिए । दोनों विकल्प संभवतः समस्याओं के बिना समर्थित हैं।
एंटोनियो

यह भी ध्यान रखें कि __attribute__((unused))है एक मालिकाना जीसीसी विस्तार । यह कुछ अन्य संकलक द्वारा समर्थित है, लेकिन मुझे लगता है कि यह MSVC के साथ काम नहीं करेगा। यह सीधे संकलक मानक का हिस्सा नहीं है, लेकिन यह कुछ अन्य विकल्पों की तरह पोर्टेबल नहीं है
झो

58

आप gcc / clang की अप्रयुक्त विशेषता का उपयोग कर सकते हैं, हालाँकि मैं इन मैक्रोज़ का उपयोग एक शीर्ष लेख में करता हूँ ताकि स्रोत पर gcc विशिष्ट गुण होने से बचा जा सके, __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):
जहां तक ​​मुझे पता है, MSVC के बराबर नहीं है __attribute__((__unused__))

नोट 2): मैक्रो तर्क जो कोष्ठक होते हैं, के लिए काम करते नहीं होगा , इसलिए यदि आप एक तर्क की तरह है कि आप नहीं कर सकते हैं करते हैं, या , यह केवल नकारात्मक पक्ष यह है मैक्रो मैं अब तक मिल गया है, इन मामलों में मैं वापस गिर सेवा
UNUSED
float (*coords)[3]
float UNUSED((*coords)[3])float (*UNUSED(coords))[3]UNUSED(void)coords;


या शायद केवल #define __attribute__(x)गैर-जीसीसी पर्यावरण के लिए (AFAIK __attribute__MSVC द्वारा समर्थित नहीं हैं)?
फ्रैंकलिन यू

यह काम कर सकता है, लेकिन डंडर पूर्वनिर्मित शब्द संकलक के लिए आरक्षित हैं, इसलिए मैं इससे बचना चाहूंगा।
विचारमेन .42

पहचानकर्ता के फंक, वेरिएस और पैरामीटर के लिए सही काम करने से पहले मेरी स्पेसिफिकेशन को कम से कम रखने के लिए, इसलिए #define POSSIBLY_UNUSED (पहचानकर्ता) विशेषता __ (__ (अप्रयुक्त )) पहचानकर्ता जैसे कुछ का उपयोग सभी तीनों के लिए किया जा सकता है
ब्रिटन केरिन

इसे लगाने के बाद जब मुझे मिलता है warning: unused parameter ‘foo’ [-Wunused-parameter](gcc
7.3.0

19

अप्रयुक्त विशेषता के साथ जीसीसी के साथ:

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

16

यह देखते हुए कि यह gcc के रूप में चिह्नित है, आप कमांड लाइन स्विच का उपयोग कर सकते हैं Wno-unused-parameter

उदाहरण के लिए:

gcc -Wno-unused-parameter test.c

बेशक यह पूरी फ़ाइल को प्रभावित करता है (और शायद परियोजना जहां आप स्विच सेट करते हैं) पर निर्भर करता है, लेकिन आपको किसी भी कोड को बदलने की आवश्यकता नहीं है।


7

स्रोत कोड के एक ब्लॉक के लिए अप्रयुक्त पैरामीटर चेतावनी को दबाने के लिए एक gcc / g ++ विशिष्ट तरीका यह है कि इसे निम्नलिखित बयानों के साथ संलग्न करें:

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

क्लैंग इन डायग्नोस्टिक प्रैग्मस का समर्थन करता है और साथ ही clang.llvm.org/docs/…
eush77

4

विशेषता लेबल करना आदर्श तरीका है। MACRO कभी-कभी भ्रम की स्थिति में ले जाता है। और शून्य (x) का उपयोग करके, हम प्रसंस्करण में एक ओवरहेड जोड़ रहे हैं।

यदि इनपुट तर्क का उपयोग नहीं कर रहे हैं, तो उपयोग करें

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

यदि फ़ंक्शन के अंदर परिभाषित चर का उपयोग नहीं कर रहा है

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

   api_call(x, hash, bkt);
}

अब बाद में अपने तर्क के लिए हैश वेरिएबल का उपयोग कर रहे हैं, लेकिन bkt की आवश्यकता नहीं है। bkt को अप्रयुक्त के रूप में परिभाषित करें, अन्यथा कंपाइलर कहता है 'bkt सेट बीटी का उपयोग नहीं किया जाता है "।

नोट: यह सिर्फ अनुकूलन के लिए चेतावनी को दबाने के लिए है।


1
आप का उपयोग करके प्रसंस्करण में कोई उपरि नहीं जोड़ते हैं void(x), संकलक इसे बाहर अनुकूलित करेगा।
मेजर 320

4

मुझे भी यही समस्या हुई। मैंने तीसरे भाग के पुस्तकालय का उपयोग किया। जब मैं इस लाइब्रेरी को संकलित करता हूं, तो संकलक (gcc / clang) अप्रयुक्त चर के बारे में शिकायत करेगा।

ऐशे ही

test.cpp: 29: 11: चेतावनी: चर 'जादू' सेट लेकिन इस्तेमाल नहीं किया गया [-यूनतम-लेकिन-सेट-चर] लघु ​​जादू [] = {

test.cpp: 84: 17: चेतावनी: अप्रयुक्त चर 'पहले_लेख'

तो समाधान बहुत स्पष्ट है। -Wno-unusedGcc / clang CFLAG के रूप में जोड़ना सभी "अप्रयुक्त" चेतावनियों को दबा देगा, यहां तक ​​कि सोचा था कि आपने -Wallसेट किया है।

इस तरह, आप किसी भी कोड को बदलने की आवश्यकता नहीं है।


1
यह ठीक है यदि आप वास्तव में सभी अप्रयुक्त चेतावनियों को अनदेखा करना चाहते हैं, लेकिन यह लगभग कभी नहीं होता है। यह आमतौर पर केवल विशिष्ट उदाहरण हैं जिन्हें आप अनदेखा करना चाहते हैं।
डैन बेहार्ड

1

MSVC में किसी विशेष चेतावनी को दबाने के लिए इसे संकलक के रूप में / wd # के रूप में निर्दिष्ट करने के लिए पर्याप्त है। मेरे CMakeLists.txt में ऐसा ब्लॉक है:

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 का क्या मतलब है, क्योंकि मैं तीन साल तक MSVC पर कोई ध्यान नहीं देता, लेकिन वे सुपरपेप्टिक चेतावनियों को दबा देते हैं जो परिणाम को प्रभावित नहीं करता है।


0

मैंने देखा है कि इस शैली का उपयोग किया जा रहा है:

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

14
हम्म। मैं यह नहीं कह सकता कि मुझे यह पसंद है, क्योंकि यह मानता है कि इसमें शामिल सभी मापदंडों को एक बूल में बदला जा सकता है।
सुमा

1
यह वास्तव में एक अच्छा सम्मेलन नहीं है, भले ही संकलक लगभग निश्चित रूप से इसका अनुकूलन करेगा, लेकिन यह वास्तव में स्पष्ट नहीं है कि क्या चल रहा है और स्थिर स्रोत चेकर्स को भ्रमित कर सकता है। बेहतर IMHO यहाँ अन्य सुझावों में से एक का उपयोग करें।
ideasman42

1
मुझे विश्वास नहीं हो रहा है कि मुझे अभी भी इस पर उत्तर मिल रहे हैं। प्रश्न में कहा गया है कि यह सी के लिए था। हां, किसी अन्य भाषा में यह काम नहीं करेगा।
मैस्टर्न

2
मैं इसका इस्तेमाल नहीं करूंगा लेकिन नवीनता कारक के लिए +1।
मंगल

2
चरों की सत्यता की जाँच करना संरक्षा के लिए चेतावनी दे सकता है। जैसे। struct { int a; } b = {1}; if (b);जीसीसी, चेतावनी दी है used struct type value where scalar is required
ideasman42

-1

रिकॉर्ड के लिए, मुझे ऊपर दिया गया अय्यूब का उत्तर पसंद है लेकिन मैं एक समाधान के बारे में उत्सुक हूं जो केवल "डू-नथिंग" में चर नाम का उपयोग कर रहा है:

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

निश्चित रूप से, इसमें कमियां हैं; उदाहरण के लिए, "अप्रयुक्त" नोट के बिना यह कोड की एक जानबूझकर लाइन के बजाय एक गलती की तरह दिखता है।

लाभ यह है कि कोई DEFINE की आवश्यकता नहीं है और यह चेतावनी से छुटकारा दिलाता है।

क्या कोई प्रदर्शन, अनुकूलन या अन्य अंतर हैं?


2
मैंने या तो MSVC के साथ इसका इस्तेमाल किया, लेकिन GCC ने "बिना प्रभाव के चेतावनी" बयान दिया। तो, अय्यूब का समाधान रास्ता तय करना है।
दिमित्री सेमीकिन

यह दृष्टिकोण अभी भी XCode
MOK9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.