2009-03-27 8 views
93
int fn(); 

void whatever() 
{ 
    (void) fn(); 
} 

क्या अप्रयुक्त वापसी मूल्य को रद्द करने का कोई कारण है, या क्या मैं सोच रहा हूं कि यह समय की पूरी बर्बादी है?अप्रयुक्त रिटर्न मानों को रद्द करने के लिए क्यों डाला गया?

फ़ॉलो करें:

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

एक बग इसकी वजह से निकल जाता है अगर मैं अपने शब्दों को खाने देंगे ...

उत्तर

65

डेविड का answer इसके लिए प्रेरणा को कवर करता है, स्पष्ट रूप से अन्य "डेवलपर्स" को दिखाने के लिए जो आप जानते हैं कि यह फ़ंक्शन रिटर्न है लेकिन आप इसे स्पष्ट रूप से अनदेखा कर रहे हैं।

यह सुनिश्चित करने का एक तरीका है कि जहां आवश्यक त्रुटि कोड हमेशा प्रबंधित किए जाते हैं।

मुझे लगता है कि सी ++ के लिए मुझे लगता है कि यह संभवतः एकमात्र ऐसा स्थान है जिसे मैं सी-स्टाइल का उपयोग करना पसंद करता हूं, क्योंकि पूर्ण स्थिर कास्ट नोटेशन का उपयोग करने से बस यहां ओवरकिल लगता है। अंत में, आप एक कोडन मानक की समीक्षा करने या एक लिख रहे हैं, तो यह भी एक अच्छा विचार है स्पष्ट रूप से कहा गया है कि अतिभारित ऑपरेटरों (का उपयोग नहीं कर समारोह कॉल अंकन) करने के लिए कॉल यह भी से मुक्त किया जाना चाहिए करने के लिए:

class A {}; 
A operator+(A const &, A const &); 

int main() { 
    A a; 
    a + a;     // Not a problem 
    (void)operator+(a,a); // Using function call notation - so add the cast. 
+0

यह एकमात्र ऐसा स्थान है जहां मैं सी-स्टाइल कास्ट भी पसंद करता हूं। मेरे कोडिंग मानक में, मैं "शून्य +" जोड़ता हूं (शून्य) भी (ठीक से parened, निश्चित रूप से: पी) –

+5

कुछ हद तक विषय बंद, लेकिन आप कभी भी "ए + ए" क्यों करेंगे? वापसी मूल्य का उपयोग किए बिना? यह वास्तव में मेरे लिए साइड इफेक्ट्स के दुरुपयोग की तरह लगता है, और कोड के इरादे को खराब करता है। –

+1

ठीक है, जिसे आप हर दिन उपयोग करेंगे, वह 'ए = ए' होगा। यह ऑब्जेक्ट को सौंपा गया है (सभी अच्छी तरह से व्यवहार कक्षाओं के लिए! :))। एक और उदाहरण है: ओएस << "हैलो वर्ल्ड" << std :: endl। उनमें से प्रत्येक "ओएस" ऑब्जेक्ट देता है। –

35

काम में हम उस का उपयोग समारोह की वापसी मूल्य नहीं है स्वीकार करने के लिए लेकिन डेवलपर ने कहा है कि यह इसे अनदेखा करने के लिए सुरक्षित है । आप सी के रूप में प्रश्न में चिह्नित के बाद से ++ आप static_cast का उपयोग करना चाहिए:

static_cast<void>(fn()); 

जहाँ तक संकलक कास्टिंग वापसी मान शून्य को जाता है के रूप में छोटे से अर्थ नहीं है।

+0

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

+0

क्या ऐसी चेतावनी है? –

+0

नहीं, ऐसा नहीं है। @ मिकोला: जीसीसी 4 के साथ आप एक विशेषता संलग्न कर सकते हैं जो कहता है कि वापसी मूल्य को अनदेखा नहीं किया जाना चाहिए जो चेतावनी को ट्रिगर करेगा। –

2

शून्य से कास्ट लागतहीन है। यह संकलक के लिए केवल जानकारी है कि इसका इलाज कैसे किया जाए।

+1

यह "लागतहीन" है यदि इसे लिखने का समय और बाद में पढ़ने, समझने (और फिर अनदेखा) कोड मुक्त है। आईएमओ, लिखना '(शून्य)' मुझे समय और ऊर्जा खर्च करता है और मुझे आश्चर्य होता है कि लेखक जानता था कि अभिव्यक्ति कैसे काम करती है। – wallyk

28

ऐसा करने के लिए सही कारण सी कोड पर इस्तेमाल किए गए टूल पर वापस lint कहा जाता है।

यह संभावित समस्याओं की तलाश करने और चेतावनियों और सुझावों को जारी करने वाले कोड का विश्लेषण करता है। यदि किसी फ़ंक्शन ने उस मान को वापस कर दिया जो तब चेक नहीं किया गया था, lint यह आकस्मिक स्थिति में चेतावनी देगा। इस चेतावनी पर lint को चुप करने के लिए, आपने कॉल को (void) पर डाला।

+1

यह इस तरह से शुरू हो सकता है, लेकिन अधिकांश उपकरणों में अब इस तरह की चेतावनियों को दबाने के लिए अन्य तंत्र हैं। इसके अलावा - यह क्यों शुरू हुआ है, विशेष रूप से सुरक्षा महत्वपूर्ण कोड के डोमेन के भीतर, यह "दस्तावेज़" डेवलपर इरादों का सामान्य तरीका बन गया है। –

+3

जीसीसी इसके साथ-साथ चेतावनी देता है। – greyfade

5

शून्य के लिए कास्टिंग प्रोग्राम की कार्यक्षमता के लिए अर्थहीन है। मैं यह भी तर्क दूंगा कि आपको उस व्यक्ति को कुछ सिग्नल करने के लिए इसका उपयोग नहीं करना चाहिए जो कोड पढ़ रहा है, जैसा कि डेविड द्वारा दिए गए उत्तर में सुझाव दिया गया है। यदि आप अपने इरादों के बारे में कुछ संवाद करना चाहते हैं, तो टिप्पणी का उपयोग करना बेहतर है। इस तरह की एक कलाकार जोड़ना केवल अजीब दिखता है और संभावित कारण के बारे में प्रश्न उठाता है। बस मेरी राय ...

+1

यह स्पष्ट रूप से दूसरों को बताने के लिए एक ज्ञात पैटर्न है कि आपको वापसी मूल्य की परवाह नहीं है, कि आप इसे संभालने के लिए भूल गए थे। – Spidey

+0

'शून्य के लिए कास्टिंग प्रोग्राम की कार्यक्षमता के लिए अर्थहीन है' स्वयं प्रलेखन के लिए और संकलन करते समय चेतावनियों की संख्या के लिए, यह _really_ नहीं है। 'आपको उस कोड को पढ़ने वाले व्यक्ति को कुछ सिग्नल करने के लिए इसका उपयोग नहीं करना चाहिए [...] एक टिप्पणी का उपयोग करना बेहतर है।जब कोड स्वयं बताता है, तो सबसे अच्छी टिप्पणी _no comment_ है। और, फिर, प्रक्रिया में एक वैध चेतावनी संकलक खुश रहता है। –

+0

'इस तरह की एक कलाकार जोड़ना केवल अजीब लगेगा और संभावित कारण के बारे में प्रश्न उठाएगा।' मैंने इनमें से एक खोजा, और इसलिए मैं इसे पढ़ रहा हूं। मेरे अनियंत्रित मस्तिष्क के लिए रहस्यमय ढेर-दुर्व्यवहार की तरह माना जाता है। – mynameisnafe

19

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

स्टैंडर्ड (2003) कहते हैं §5.2.9/4 कहते हैं में,

किसी भी अभिव्यक्ति स्पष्ट रूप से किया जा सकता है टाइप करने के लिए परिवर्तित "सीवी शून्य।" अभिव्यक्ति मूल्य खारिज है।

तो तुम लिख सकते हैं:

//suppressing unused variable warnings 
static_cast<void>(unusedVar); 
static_cast<const void>(unusedVar); 
static_cast<volatile void>(unusedVar); 

//suppressing return value warnings 
static_cast<void>(fn()); 
static_cast<const void>(fn()); 
static_cast<volatile void>(fn()); 

//suppressing unsaved expressions 
static_cast<void>(a + b * 10); 
static_cast<const void>(x &&y || z); 
static_cast<volatile void>(m | n + fn()); 

सभी रूपों मान्य हैं। मैं आमतौर पर इसे कम करता हूं:

//suppressing expressions 
(void)(unusedVar); 
(void)(fn()); 
(void)(x &&y || z); 

यह भी ठीक है।

+0

सिवाय इसके कि यह हमेशा संकलक चेतावनियों को बंद नहीं करता है। gcc – Matt

+0

@Matt को कास्टिंग करने का जवाब नहीं लगता है: जीसीसी का कौन सा संस्करण आप उपयोग कर रहे हैं? क्या आप ideone.com या stacked-crooked.com पर अपना कोड पोस्ट कर सकते हैं (बाद वाला बेहतर है)। – Nawaz

+1

मानक "त्याग" शब्द का अर्थ यह है कि चेतावनी लिंटर्स द्वारा नहीं उठाई जानी चाहिए? –

2

सी में, यह पूरी तरह से शून्य करने के लिए ठीक है। वस्तुतः कोई भी बयान के इरादे को समझ जाएगा।

सी ++ में, आपके पास अन्य उपकरण हैं। चूंकि सी डाले आमतौर पर पर सिकोड़ी रहे हैं, और के बाद से स्पष्ट डाली शून्य होने की संभावना अपने सहकर्मियों (यह मेरा आश्चर्य), मैं इस समारोह टेम्पलेट कहीं

template <typename T> 
void use_expression(const T&) {} 

है और मैं

... 
use_expression(foo()); 

जहां का उपयोग आश्चर्य होगा मैं सी (void)foo() सी

+3

या बस "#Dfine IGNORE_RESULT (fn) अगर (fn)"। सी और सी ++ में काम करता है और इसका अर्थ बहुत स्पष्ट है। – Matt

+0

@ मैट उस मैक्रो के साथ एक समस्या है। 'If ​​(x) IGNORE_RESULT (f()) के बारे में कैसे; अन्य जी(); '? यदि स्टेटमेंट गलत है तो 'else' गलत हो जाता है। –

+0

कॉलिन, हाँ यह सच है। – Matt

1

इसके अलावा जब आपका कोड सत्यापित करना मिस्टा (या अन्य) मानकों का अनुपालन करता है, तो एलडीआरए जैसे स्वचालित उपकरण आपको उस फ़ंक्शन को कॉल करने की अनुमति नहीं देंगे, जिसमें एक रिटर्न प्रकार है, आप ई xplicitly लौटा मूल्य (शून्य)

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