क्यों एक अप्रयुक्त फ़ंक्शन पैरामीटर मान को शून्य करने के लिए?


98

कुछ C प्रोजेक्ट में, मैंने यह कोड देखा है:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

क्या दो जातियां किसी उद्देश्य की पूर्ति के लिए काम करती हैं?


बंद करने के लिए मतदान, सही उत्तर के रूप में (अप्रयुक्त मापदंडों के बारे में संकलक चेतावनी को रोकना) चार्ल्स से जुड़े प्रश्न में है।
TED

@ कोडी ग्रे - इसे उसी कारण से बंद किया गया था। हालाँकि यह वास्तव में उस सवाल का एक हिस्सा नहीं था। 689677 शून्य रिटर्न के बारे में बात कर रहा था, पैरामीटर नहीं।
TED

19
वास्तव में दोनों डुप्लिकेट इस प्रश्न के लिए मान्य नहीं हैं। एक C ++ है, दूसरा रिटर्न मानों के बारे में है। ये वही बातें नहीं हैं । क्या कोई सी पैरामीटर डुप्लिकेट है?
मैट जॉइनर

2
यह एक अलग सवाल है कि सुझाए गए डुप्लिकेट क्या शामिल हैं। मैं देख सकता हूं कि गलती क्यों की गई थी, हालांकि। पुनः (स्पष्ट रूप से) खोला गया।
टिम पोस्ट

4
सूचना: कृपया इसे C ++ प्रश्न के डुप्लिकेट के रूप में बंद न करें क्योंकि C ++ (void)कुछ भिन्न प्रभाव का उपयोग करता है। यह प्रश्न C
एंटटी हवाला

जवाबों:


89

यह संकलक की चेतावनी से बचने के लिए है क्योंकि कुछ पैरामीटर अप्रयुक्त हैं।


3
चेतावनी को दबाने का सबसे अच्छा तरीका क्या है: stackoverflow.com/questions/3417837/…
Ciro Santilli Sant to to to

@Benoit क्या वास्तव में शून्य करने के लिए कास्टिंग करता है? संकलक को दिखाने के लिए इसका एकमात्र कार्य है कि आप जानबूझकर किसी चीज़ को अनदेखा कर रहे हैं या (शून्य) वास्तव में कुछ करते हैं और जब संकलक इसे देखता है, तो यह सिर्फ चर के साथ कुछ करने के रूप में गिना जाएगा और इसलिए चेतावनी जारी नहीं करता है?
टैन वांग

2
@TanWang इसका एकमात्र कार्य संकलक को दिखाना है जो आप जानबूझकर कुछ अनदेखा कर रहे हैं। यह रनटाइम पर कुछ नहीं करेगा।
zwol

14

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

शरीर में पैरामीटर नाम का उल्लेख करने का कारण चेतावनियों से बचना है

unused.c: In function l_alloc’:
unused.c:3:22: warning: unused parameter ud [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

इस चेतावनी को फ़ंक्शन बॉडी में वास्तविक पैरामीटर का उपयोग करके दबाया जा सकता है। उदाहरण के लिए यदि आपके पास निम्न कथन है:

ud;

यह चेतावनी अब दबा दी गई है। हालाँकि अब GCC एक और चेतावनी पेश करेगी :

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

यह चेतावनी बताती है कि ud;वाक्यगत रूप से मान्य C होने के दौरान कथन कुछ भी प्रभावित नहीं करता है, और संभवतः एक गलती है, कथन के विपरीत नहीं

abort;

जो शायद abort();इसके बजाय कुछ करने के लिए लिखा जाना चाहिए था।

और यही वह जगह है जहां (void)कलाकार आता है - यह संकलक को स्पष्ट रूप से बताएगा और स्पष्ट रूप से कथन का बिल्कुल प्रभाव नहीं होना चाहिए।

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