NULL मुख्य () से क्यों लौट रहा है?


10

मुझे कभी-कभी कोडर्स दिखाई देते हैं जो C और C ++ प्रोग्राम्स के NULLरिटर्न वैल्यू के रूप में उपयोग करते हैं main(), उदाहरण के लिए कुछ इस तरह से:

#include <stdio.h>

int main()
{
    printf("HelloWorld!");

    return NULL;
} 

जब मैं इस `कोड को gcc के साथ संकलित करता हूँ तो मुझे इसकी चेतावनी मिलती है:

चेतावनी: रिटर्न एक डाली के बिना सूचक से पूर्णांक बनाता है [-विशेष-रूपांतरण]

जो उचित है क्योंकि मैक्रो NULLका विस्तार किया जाएगा (void*) 0और मुख्य का वापसी मूल्य प्रकार का होगा int

जब मैं एक छोटा C ++ प्रोग्राम बनाता हूं:

#include <iostream>
using namespace std;

int main()
{
    cout << "HelloWorld!";

    return NULL;
}

और इसे जी ++ के साथ संकलित करें, मुझे एक बराबर चेतावनी मिलती है:

चेतावनी: NULL [-Wconversion-null] से गैर-पॉइंटर प्रकार 'int' में परिवर्तित करना

लेकिन जब वे चेतावनी देते हैं तो वे NULLरिटर्न वैल्यू के रूप में क्यों इस्तेमाल करते हैं main()? क्या यह केवल खराब कोडिंग शैली है?


  • चेतावनी के बावजूद वापसी मूल्य के NULLबजाय उपयोग करने का क्या कारण है ?0main()
  • क्या यह कार्यान्वयन-परिभाषित है कि क्या यह उचित है या नहीं और यदि ऐसा है तो कोई भी कार्यान्वयन पॉइंटर वैल्यू वापस क्यों लेना चाहेगा?

4
आपको उनसे सीधे पूछना चाहिए।
जुआनकोपंजा

5
"वे NULL का उपयोग मुख्य के रिटर्न मान के रूप में क्यों करते हैं ()" - हम नहीं। उस कोड का लेखक करता है। मैं क्यों उनके औचित्य पर उनकी सुनवाई सुनने में दिलचस्पी होगी ।
WhozCraig

1
@ मास्को से हाँ, लेकिन मुझे यह देखना था कि क्या यह वास्तव में 0. ^ ^ है - EXIT_FAILURE8 है, और ऐसा लगता है कि 1 का उपयोग करना विफलता के लिए अच्छा नहीं है क्योंकि यह कुछ समय में कुछ कार्यक्रमों में सफलता के रूप में उपयोग किया जाता है।
वेल्मियो

2
@RobertSsupportsMonicaCellio अगर वास्तव में आपको जो प्रतिक्रिया मिली, वह दुखद है। सबसे पहले, इसका कोई मतलब नहीं है (अगर यह हर जगह कहीं और के बजाय अधिक समझ में आता है )। दूसरा, यह एक बिक आउट है। यदि आप कोड लिख रहे हैं, तो आपके पास बेहतर कम्पास होगा कि क्या यह सही है; बस इसके साथ नहीं जाना चाहिए क्योंकि यह ऐसा लगता है कि यह किसी के द्वारा किया जाता है ... आपको लगता है कि सुई सही दिशा की ओर इशारा करती है (इस प्रकार आप क्यों पूछ रहे हैं); इतना नहीं है कि उस कोड को लिखने वाले व्यक्ति ने, फिर आपको उस कारण के रूप में जवाब दिया।
WhozCraig

2
सी में, NULLपॉइंटर को 0कास्ट (बिना कास्ट void *) के रूप में परिभाषित करने के लिए पूरी तरह से वैध है । इस मामले में, दोष किसी का ध्यान नहीं जाता है और चेतावनी उत्पन्न नहीं करता है। यह अभी भी नहीं है कि NULL का उपयोग किस लिए किया जाना चाहिए।
Ctx

जवाबों:


14

जो उचित है

हाँ।

क्योंकि मैक्रो NULLका विस्तार किया जाएगा(void*) 0

नहीं। C ++ में मैक्रो को [support.types.nullptr] तक विस्तारित NULL नहीं होना चाहिए(void*) 0 । यह केवल C में ऐसा कर सकता है।

बहरहाल, इस तरह कोड लिखने के बाद से भ्रामक है NULLका उल्लेख माना जाता है नल पॉइंटर निरंतर है, यह कैसे लागू हो जाता है की परवाह किए बिना। एक के स्थान पर इसका उपयोग करना intएक तार्किक त्रुटि है।

  • चेतावनी NULLके main()बावजूद 0 के बदले वापसी मूल्य के रूप में उपयोग करने का क्या कारण है ?

अज्ञान। ऐसा करने का कोई अच्छा कारण नहीं है ।

  • क्या यह कार्यान्वयन-परिभाषित है कि क्या यह उचित है या नहीं और यदि ऐसा है तो कोई भी कार्यान्वयन पॉइंटर वैल्यू वापस क्यों लेना चाहेगा?

नहीं, यह कभी उचित नहीं है । यह कार्यान्वयन पर निर्भर है कि क्या संकलक इसे अनुमति देता है। एक अनुरूप C ++ संकलक अच्छी तरह से चेतावनी के बिना अनुमति दे सकता है।


1
मेरी सामान्य गड़गड़ाहट: यह कार्यान्वयन-परिभाषित नहीं है कि क्या संकलक इसे अनुमति देता है; यह लागू-विशिष्ट है । मानक में, "इम्प्लांटेशन-डिफाइन्ड" का अर्थ है कि कार्यान्वयन को दस्तावेज करना चाहिए कि वह क्या करता है।
पीट बेकर

@PeteBecker मैंने इसे लिखने के दौरान विराम दिया था, लेकिन वैसे भी आगे बढ़ गया (क्योंकि "कार्यान्वयन-विशिष्ट" और इसी तरह के वाक्यांश सिर्फ अप्राकृतिक लगते हैं)। लेकिन आप सही हैं, मैं इसे बदल दूंगा।
कोनराड रुडोल्फ

मुझे लगता है कि एकमात्र कारण "कार्यान्वयन-परिभाषित" स्वाभाविक लगता है कि लोगों को इसका दुरुपयोग देखने के लिए उपयोग किया जाता है। <g>
पीट बेकर

8

जब मैं इस `कोड को gcc के साथ संकलित करता हूँ तो मुझे इसकी चेतावनी मिलती है:

warning: return makes integer from pointer without a cast

ऐसा इसलिए है क्योंकि आप lax संकलक विकल्पों के साथ संकलन करते हैं। सख्त सी मानक सेटिंग्स का उपयोग करें -std=c11 -pedantic-errorsऔर आपको अपेक्षित संकलक त्रुटि मिलेगी, कार्यान्वयन पर जहां NULLअशक्त सूचक स्थिर करने के लिए फैलता है (void*)0"कास्ट के बिना सूचक से पूर्णांक / पूर्णांक से सूचक" देखें ।

कार्यान्वयन पर जहां NULLविस्तार होता है 0, कोड सख्ती से मानक अनुपालन बोल रहा है, लेकिन बहुत खराब शैली, गैर-पोर्टेबल और सबसे खराब: पूर्ण बकवास।

और इसे जी ++ के साथ संकलित करें, मुझे एक बराबर चेतावनी मिलती है:

warning: converting to non-pointer type int from NULL [-Wconversion-null]

C ++ 11 और उसके बाद, का NULLउपयोग नहीं किया जाना चाहिए - इसके बजाय उपयोग करें nullptr। इसे मुख्य () से वापस लौटाया जाना गलत है। NULLहमेशा 0C ++ में फैलता है , इसलिए कड़ाई से बोलते हुए यह काम करेगा, लेकिन यह बहुत खराब शैली है और सबसे खराब: पूर्ण बकवास है।

क्या यह केवल खराब कोडिंग शैली है?

बिना किसी औचित्य के न सिर्फ खराब, बल्कि बकवास कोडिंग स्टाइल। इसे लिखने वाला प्रोग्रामर अक्षम था।


2

क्या यह केवल खराब कोडिंग शैली है?

और भी बुरा। यह इंगित करने का सही तरीका है कि प्रोग्राम ठीक किया गया है

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}

1
वह शुद्ध पांडित्य है। सी मानक के अनुसार, एक 0 तर्क exit()(या मुख्य से 0 वापसी मान) का अर्थ है EXIT_SUCCESS
मॉसवी

और C99 के बाद से आप सिर्फ छोड़ सकते हैं returnसे main। तो, आपके कार्यक्रम का एक और अधिक "सही" संस्करण है int main(void){};-)
मॉसवी

1

में? कुछ / कई / सभी? C ++ कार्यान्वयन NULLएक मैक्रो का विस्तार है 0

यह जब प्रभाव में विस्तारित होता है return 0। जो एक वैध रिटर्न मूल्य है।

क्या यह केवल खराब कोडिंग शैली है?

हाँ।

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