आप तृतीय पक्ष कोड में gcc से बाहर आने वाले अप्रयुक्त चर चेतावनियों को कैसे निष्क्रिय कर सकते हैं जिसे मैं संपादित नहीं करना चाहता?


93

मैं जानना चाहूंगा कि अप्रयुक्त चर चेतावनियों को बंद करने के लिए आप gcc कंपाइलर को क्या स्विच करते हैं? मुझे खिड़कियों पर बूस्ट आउट होने की त्रुटियां हो रही हैं और मैं बूस्ट कोड को छूना नहीं चाहता:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

मैंने दोनों का उपयोग करने की कोशिश की -Wunused-valueऔर -Wno-unused-valueन ही ऊपर दिए गए संदेशों को दबाया।

सही आज्ञा क्या है, यहाँ मेरी संकलन पंक्ति है:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

शायद -Wallमेरे लक्ष्य को ओवरराइड करता है?


जैसा कि त्रुटि संदेश कम या ज्यादा कहता है, कोशिश करें-Werror=no-unused-variable
जोआचिम इस्कसन

जवाबों:


236

-Wno-unused-variableस्विच आमतौर पर काम कर देता है। हालाँकि, यह एक बहुत ही उपयोगी चेतावनी है यदि आप अपने प्रोजेक्ट में इन बातों का ध्यान रखते हैं। यह तब कष्टप्रद हो जाता है जब जीसीसी आपको अपने कोड में नहीं होने वाली चीजों के बारे में चेतावनी देना शुरू कर देता है।

मैं आपको चेतावनी जारी रखने की सलाह दूंगा, लेकिन -isystemइसके बजाय -Iतीसरे पक्ष के प्रोजेक्ट्स की निर्देशिकाओं का उपयोग करें । यह ध्वज बताता है कि जीसीसी आपको उस सामान के बारे में चेतावनी नहीं देता है जिसका आपके पास कोई नियंत्रण नहीं है।

उदाहरण के लिए, के बजाय -IC:\\boost_1_52_0कहते हैं -isystem C:\\boost_1_52_0

आशा करता हूँ की ये काम करेगा। शुभ लाभ!


इस सेटिंग को कहां जोड़ें? क्या यह "प्रोजेक्ट सेटिंग्स / AVR GNU C कम्पाइलर / विविध" के तहत किया गया था, लेकिन इसे अनदेखा किया जाएगा (पथ सही है, फिर भी चेतावनी प्राप्त करें) जब निर्देशिका सेटिंग्स में इसे जोड़ते हैं (सापेक्ष पथ चेकबॉक्स अनचेक करें) AtmelStudio क्रैश हो जाएगा।
hfrmobile

3
हमारे पास -Wno-unused-parameterअप्रयुक्त फ़ंक्शन मापदंडों के लिए भी है , अप्रयुक्त फ़ंक्शन के -Wno-unused-functionलिए
नोग थान नं

1
आपको जरूरत है:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
रॉनी शेरेर

81

कभी-कभी आपको केवल कुछ चेतावनियों को दबाने की जरूरत होती है और आप अन्य चेतावनियों को सुरक्षित रखना चाहते हैं। अपने कोड में, आप जीसीसी की अप्रयुक्त विशेषता का उपयोग करके चर और यहां तक ​​कि औपचारिक मापदंडों के लिए चेतावनी को दबा सकते हैं । मान लें कि आपके पास यह कोड स्निपेट है:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

एक स्थिति हो सकती है, जब आपको इस फ़ंक्शन को एक हैंडलर के रूप में उपयोग करने की आवश्यकता होती है - जो (imho) सी ++ बूस्ट लाइब्रेरी में काफी आम है। तब आपको दूसरे औपचारिक पैरामीटर संस्करण की आवश्यकता होती है , इसलिए फ़ंक्शन का हस्ताक्षर उसी तरह होता है जैसा कि हैंडलर को टेम्पलेट की आवश्यकता होती है, अन्यथा संकलन विफल हो जाएगा। लेकिन आप वास्तव में फ़ंक्शन में ही इसकी आवश्यकता नहीं है ...

चेतावनियों से बाहर किए जाने के लिए चर या औपचारिक पैरामीटर को कैसे चिह्नित किया जाए इसका समाधान यह है:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

जीसीसी के कई अन्य पैरामीटर हैं, आप उन्हें मैन पेजों में देख सकते हैं । यह सी कार्यक्रमों के लिए भी काम करता है, न केवल सी ++, और मुझे लगता है कि इसका उपयोग लगभग हर फ़ंक्शन में किया जा सकता है, न कि केवल हैंडलर के लिए। आगे बढिए और इसे आजमाइए! ;)

पुनश्च: हाल ही में मैंने इस तरह से टेम्पलेट में बूस्ट्स के क्रमांकन की चेतावनी को दबाने के लिए इसका इस्तेमाल किया:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

संपादित करें: जाहिर है, मैं आपके सवाल का जवाब नहीं दिया, जैसा कि आप की जरूरत है, drak0sha ने इसे बेहतर किया। यह इसलिए है क्योंकि मैंने मुख्य रूप से प्रश्न के शीर्षक का अनुसरण किया है, मेरा बुरा। उम्मीद है, यह अन्य लोगों की मदद कर सकता है, जो उस शीर्षक के कारण यहां आते हैं ... :)


7
औपचारिक मापदंडों के लिए, आप नाम को छोड़ सकते हैं, जैसे void func(unsigned number, const int)। फिर, अप्रयुक्त के बारे में भी शिकायत नहीं करेंगे version
ओलाफ डाइटशेक

@OlafDietsche मुझे लगता है कि यह gccआपके द्वारा उपयोग किए जा रहे संस्करण पर निर्भर करता है । IIRC, मुझे इसका उपयोग 4 साल पहले करना था, अप्रयुक्त के बारे में चेतावनी को दबाने के लिए version। ;)
डी'केज

66

यदि आप gcc का उपयोग कर रहे हैं और चयनित कोड के लिए चेतावनी को अक्षम करना चाहते हैं, तो आप #pragma संकलक निर्देश का उपयोग कर सकते हैं:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

आपके द्वारा नियंत्रित कोड के लिए, आप __attribute__((unused))संकलक को निर्देश देने के लिए भी उपयोग कर सकते हैं कि विशिष्ट चर का उपयोग नहीं किया जाता है।



आम तौर पर, मैं कहूंगा कि #pragma निर्देशों का उपयोग करना बहुत सुरक्षित नहीं है, जब तक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं, या आप समानांतर उपयोग के लिए OpenMP का उपयोग कर रहे हैं ...;)
Dee'Kej

1
@ डी'केजे #pragmaनिर्देश पूरी तरह से सुरक्षित हैं यदि आप उन्हें लपेटते हैं #ifdef some_compiler ... #endif। चेतावनी एक संकलक-विशिष्ट विशेषता है और इसे मानक द्वारा परिभाषित नहीं किया जाता है। आप बिना कोड के किसी भी चेतावनी को दबा नहीं सकते #pragma
कोटसुकस

@ vladislav-toncharov आप चेतावनी विशिष्ट संकलक होने के बारे में सही हैं। लेकिन हम यहां सामान्य तौर पर संकलक चेतावनियों के बारे में बात नहीं कर रहे हैं - हम विशेष रूप से जीसीसी के बारे में बात कर रहे हैं। आप इस बारे में भी सही हैं कि #pragma प्रति कहना हानिकारक नहीं है। हालाँकि, IMO बहुत से लोग यह नहीं जानते कि #pragma का सही उपयोग कैसे किया जाए, और इसीलिए मैं इसे "खतरनाक" (बेहतर शब्दों की कमी के लिए) मानता हूँ।
डे'केज

15

man gccचेतावनी विकल्पों के तहत देखें । वहाँ आप का एक पूरा गुच्छा हैunused

चेतावनी के विकल्प
...

यदि आप उनमें से किसी के साथ उपसर्ग करते हैं no-, तो यह इस चेतावनी को अक्षम कर देगा।

कई विकल्पों में लंबे नाम होते हैं, जिनका प्रारंभ -f या with -W --- उदाहरण के लिए, -fmove-loop-invariants, -Wformat और इसी तरह होता है। इनमें से अधिकांश में सकारात्मक और नकारात्मक दोनों रूप हैं; -ffoo का नकारात्मक रूप -foo-foo होगा। यह मैनुअल केवल इन दो रूपों में से एक है, जो भी डिफ़ॉल्ट नहीं है।

चेतावनियों का अनुरोध करने या दबाने के लिए विकल्पों पर अधिक विस्तृत विवरण पाया जा सकता है


नहीं पता था कि मैं किसी भी चेतावनी के साथ "नहीं-" उपसर्ग कर सकता हूं।
आरएनए

10

का प्रयोग करें -Wno-unused-variableकाम करना चाहिए।


आह, अप्रयुक्त-चर, अप्रयुक्त-मूल्य नहीं!
विलियमकेफ

5
या -Wno-error=unused-variableयदि आप त्रुटि को दूर करना चाहते हैं और चेतावनी रखना चाहते हैं।
ओस्कर एन।

1
आप वास्तव में देख सकते हैं कि वास्तविक चेतावनी क्या है [-Werror=unused-variable]
मैट पीटरसन

3

संकलक पहले से ही आपको बता रहा है, valueलेकिन यह नहीं है variable। आप ढूंढ रहे हैं -Wno-unused-variable। इसके अलावा, g++ --help=warningsउपलब्ध विकल्पों की सूची देखने का प्रयास करें।


3

आप अप्रयुक्त चर चेतावनियों को gcc से कैसे निष्क्रिय करते हैं?
मुझे खिड़कियों पर बूस्ट आउट होने की त्रुटियाँ हो रही हैं और मैं बूस्ट कोड को छूना नहीं चाहता ...

आप बूस्ट के Trac पर जाएँ और Boost के खिलाफ बग रिपोर्ट दर्ज करें।

आपका आवेदन लाइब्रेरी चेतावनियों और त्रुटियों को साफ़ करने के लिए ज़िम्मेदार नहीं है। पुस्तकालय अपनी चेतावनियों और त्रुटियों को दूर करने के लिए जिम्मेदार है।


0

-Wallऔर -WextraGCC में चरण निर्धारित करता है और बाद में -Wno-unused-variableप्रभावी नहीं हो सकता है। उदाहरण के लिए, यदि आपके पास:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

तब जीसीसी निर्देश देखता है -Wall -Wextraऔर अनदेखी करने लगता है-Wno-unused-variable

यह बजाय नीचे इस तरह दिख सकता है और आपको अप्रयुक्त चर पर अपने संकलन में बंद नहीं होने का वांछित प्रभाव मिलता है:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

एक अच्छा कारण है कि इसे "चेतावनी" बनाम "त्रुटि" कहा जाता है। संकलन को केवल इसलिए विफल करना क्योंकि आप कोड पूर्ण नहीं हैं (कहते हैं कि आप एल्गोरिथम को बाहर निकाल रहे हैं) को हरा सकते हैं।


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