2008-12-22 8 views
54

मैं जैसे, संकलन समय का एक समूह इस बात पर ज़ोर दिया है:मैं जीसीसी में "परिभाषित लेकिन उपयोग नहीं की गई" चेतावनियों को कैसे छिपा सकता हूं?

CASSERT(isTrue) or CASSERT2(isTrue, prefix_) 

जब मैं 'prefix_LineNumber' defined but not used जैसे कई चेतावनी मिल जीसीसी के साथ संकलन। क्या संकल्प समय आवेषण के लिए चेतावनी छिपा सकता है? मुझे जीसीसी दस्तावेज खोजने में कोई भाग्य नहीं था। मैंने सोचा कि मेरे पास उसी मैक्रो के अंदर स्वचालित रूप से विविध रूप से उपयोग किया जा सकता है लेकिन मैं इसे करने के किसी भी तरीके से नहीं सोच सकता था।

क्या कोई भी जीसीसी में उस चेतावनी को छिपाने के तरीके के बारे में जानता है?

उत्तर

2

कैसे -Wunused-label? जीसीसी अन्य compilers के साथ संघर्ष नहीं के कारण के लिए

+3

नहीं लेकिन अपने गलत जवाब मुझे सही एक करने के लिए नेतृत्व: डी –

42

समाधान

#ifdef __GNUC__ 
#define VARIABLE_IS_NOT_USED __attribute__ ((unused)) 
#else 
#define VARIABLE_IS_NOT_USED 
#endif 

int VARIABLE_IS_NOT_USED your_variable; 
+1

वास्तव में कैसे यह भी किया है कि अप्रयुक्त फ़ंक्शन तर्कों के लिए जीसीसी स्रोत में। +1 :) –

+2

मैंने पाया कि ____attribute____ ((____unused____) का उपयोग करके) जीसीसी 4.x.x – mtasic85

3

यह आपके स्थिर ज़ोर मैक्रो का ब्यौरा जानने के बिना जवाब देना मुश्किल है। शायद आप इस समस्या से बचने के लिए एक अलग मैक्रो में बदल सकते हैं? जैसा कि सुझाव दिया गया था, आप या तो मैक्रो में 'अप्रयुक्त' विशेषता जोड़ सकते हैं, या आप CASSERT() के एक अलग रूप का उपयोग कर सकते हैं।

यहाँ कुछ विकल्प यह बताया गया है:

http://www.jaggersoft.com/pubs/CVu11_3.html

http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html

http://www.pixelbeat.org/programming/gcc/static_assert.html

28

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

int var; // var is not used 
(void)var; // null statement, cast to void -- suppresses warning 

एक सामान्य तकनीक इस के लिए एक मैक्रो बनाने के लिए है:

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

int var; 
UNUSED(var); 
+1

के लिए काम करता है विचित्र रूप से, मुझे अभी भी चेतावनियां मिलती हैं। उदाहरण के लिए, जब मैं सिस्टम() को कॉल करता हूं और वापसी की परवाह नहीं करता: '(शून्य) सिस्टम (cmd.c_str());' मुझे समझ में नहीं आता कि यह चेतावनी क्यों उत्पन्न करनी चाहिए। – BobDoolittle

+0

@BobDoolittle: हू, यह दिलचस्प है, मैंने पहले उस व्यवहार को नहीं देखा है। आप किस कंपाइलर का कंपाइलर और किस संस्करण का उपयोग कर रहे हैं? उबंटू 14.04 पर –

+0

जीसीसी 4.8.2। मैं अपने सभी स्रोतों को संकलित-परिणाम के साथ संकलित कर रहा हूं, और उन स्थानों के लिए चेतावनी को स्पष्ट रूप से दबाने का एक तरीका ढूंढ रहा हूं जहां यह सत्यापित किया गया है कि व्यवहार सही है। मैंने हमेशा के लिए एक कास्ट (शून्य) के लिए उपयोग किया है, लेकिन यहां काम नहीं कर रहा है। – BobDoolittle

89

बस, जबकि इस समस्या के समाधान के लिए खोज इस सूत्र को देखा। मैं यहाँ पूर्णता समाधान मैंने पाया के लिए पोस्ट ...

जीसीसी संकलक झंडे को नियंत्रित कि अप्रयुक्त warnings में शामिल हैं:

-Wunused-function 
-Wunused-label 
-Wunused-parameter 
-Wunused-value 
-Wunused-variable 
-Wunused (=all of the above) 

इनमें से प्रत्येक के साथ एक इसी नकारात्मक रूप है "नहीं-" डब्ल्यू के बाद सम्मिलित जो चेतावनी को बंद कर देता है (यदि इसे चालू किया गया था - उदाहरण के लिए, वाल)। इस प्रकार, आपके मामले में आपको

-Wno-unused-function 

बेशक यह पूरे कोड के लिए काम करता है, न केवल संकलन-समय पर जोर देता है। कार्य-विशिष्ट व्यवहार के लिए, Function attributes पर एक नज़र डालें।

+0

क्या यह प्रति फ़ाइल सेट किया जा सकता है? – Danijel

25

यह सबसे कष्टप्रद चेतावनियों में से एक है, हालांकि मुझे लगता है कि यह मृत कोड की जांच करने के लिए उपयोगी (कभी-कभी) उपयोगी हो सकता है। लेकिन मेरे पास आमतौर पर डिबगिंग के लिए स्थिर कार्य होते हैं, या भविष्य में कभी-कभी उपयोगी काम करते हैं, या केवल अस्थायी रूप से उपयोग किए जाते हैं, और मैं उन्हें कोड में रखना चाहता हूं।

सौभाग्य से यह चेतावनी इनलाइन फ़ंक्शंस की परवाह नहीं करती है।

inline static foo() 
{ 
} 
+3

इनलाइन केवल मुझे आवश्यक कामकाज है, धन्यवाद। –

+0

एक आकर्षक चीज की तरह काम करें ... UPVOTED – NSPratik

+1

फिर आप प्रीप्रोसेसर निर्देशों में ऐसे फ़ंक्शन क्यों नहीं लपेटते हैं। जैसे '#ifdef UNIT_TEST स्थैतिक foo()'? – Mawg

4
#define UNUSED_VAR  __attribute__ ((unused)) 
किसी भी चर सिर्फ उदाहरण के लिए अपनी तरह से पहले ऊपर मैक्रो का उपयोग के लिए

:

UNUSED_VAR int a = 2; 
+1

हमने इसे आउट प्रोजेक्ट के लिए अपनाया है। लेकिन, केवल उन मामलों के लिए जहां संकलक इसकी चेतावनियों में गलत है। उदाहरण के लिए, हमारे पास कुछ चर हैं जिन्हें केवल पॉइंटर द्वारा एक्सेस किया जाता है, इसलिए संकलक का मानना ​​है कि उन्हें अप्रयुक्त किया जाना चाहिए। इस तरह के लिए चेतावनी चेतावनी के लिए स्वीकार्य है, लेकिन वास्तव में अप्रयुक्त चर हमारे कोड से हटा दिया जाना चाहिए। – Mawg

संबंधित मुद्दे

 संबंधित मुद्दे