क्या C ++ या C में foo (शून्य) और foo () के बीच अंतर है?


253

इन दो फ़ंक्शन परिभाषाओं पर विचार करें:

void foo() { }

void foo(void) { }

क्या इन दोनों में कोई अंतर है? यदि नहीं, तो voidवहां तर्क क्यों है ? एस्थेटिक कारण?


जवाबों:


317

में सी :

  • void foo()का अर्थ है " fooअनिर्दिष्ट प्रकार के तर्कों की अनिर्दिष्ट संख्या लेने वाला कार्य "
  • void foo(void)" fooकोई तर्क नहीं लेने वाला एक फ़ंक्शन "

में सी ++ :

  • void foo()" fooकोई तर्क नहीं लेने वाला एक फ़ंक्शन "
  • void foo(void)" fooकोई तर्क नहीं लेने वाला एक फ़ंक्शन "

लिख कर foo(void), इसलिए, हम दोनों भाषाओं में एक ही व्याख्या को प्राप्त करने और हमारे हेडर बहुभाषी बनाने (हालांकि हम आम तौर पर सही मायने में पार भाषा उन्हें बनाने के लिए हेडर के लिए कुछ और काम करने के लिए की जरूरत है; अर्थात्, उन्हें एक में लपेट extern "C"अगर हम संकलन सी ++)।


10
लेकिन अगर C ++ को आवश्यकता होती void, तो वह "सबसे अधिक परेशान करने वाले पार्स" समस्या से बच सकता था।
एड्रियन मैकार्थी

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

16
हाल ही में एक सवाल पर, @James Kanze ने एक दिलचस्प ख़बर पोस्ट की। इसे खोने से बचने के लिए यहां रिपॉस्ट करें: C के पहले संस्करणों ने उन पैरामीटरों की संख्या निर्दिष्ट करने की अनुमति नहीं दी, जिन्हें कोई फ़ंक्शन ले सकता है, इस प्रकार void foo()फ़ंक्शन को घोषित करने का एकमात्र सिंटैक्स था। जब हस्ताक्षर जहां प्रस्तुत किए गए थे, सी समिति को पुराने सिंटैक्स से नो-पैरामीटर की अवहेलना करनी थी, और void foo(void)सिंटैक्स की शुरुआत की । C ++ ने इसे संगतता के लिए लिया।
मैथ्यू एम।

3
क्या आप मुझे C C90 का एक उदाहरण दे सकते हैं और बाद में उपयोग void foo()करने के बजाय void foo(void)एक कार्यात्मक अंतर पैदा करेंगे? यानी मैं कई वर्षों से शून्य के बिना संस्करण का उपयोग कर रहा हूं और किसी भी समस्या को देखा है, क्या मुझे कुछ याद आ रहा है?
chacham15

6
@ chacham15 void foo() { if ( rand() ) foo(5); } संकलित करता है और चलाता है (जब तक आप बहुत भाग्यशाली नहीं हैं, तब तक अपरिभाषित व्यवहार करते हैं), जबकि void foo(void)एक ही शरीर के साथ एक जटिल त्रुटि का कारण होगा।
MM

39

मुझे पता है कि आपका प्रश्न C ++ से संबंधित है, लेकिन जब C का उत्तर आता है तो K & R, पृष्ठ 72-73 में पाया जा सकता है:

इसके अलावा, अगर एक फ़ंक्शन घोषणा में तर्कों को शामिल नहीं किया जाता है, जैसे कि

double atof();

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


लेकिन सवाल परिभाषाओं के बारे में है, उस स्थिति में प्रासंगिक सी नियम एक फ़ंक्शन घोषणा में एक खाली सूची है जो उस फ़ंक्शन की परिभाषा का हिस्सा है जो निर्दिष्ट करता है कि फ़ंक्शन का कोई पैरामीटर नहीं है।
jinawee 12

9

C ++ 11 N3337 मानक ड्राफ्ट

इसमें कोई फर्क नही है।

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

अनुलग्नक C "संगतता" C.1.7 क्लाज 8: घोषणाकर्ता कहते हैं:

8.3.5 परिवर्तन: C ++ में, एक खाली पैरामीटर सूची के साथ घोषित एक फ़ंक्शन कोई तर्क नहीं लेता है। सी में, एक खाली पैरामीटर सूची का अर्थ है कि फ़ंक्शन तर्कों की संख्या और प्रकार अज्ञात हैं।

उदाहरण:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

तर्क: यह गलत कार्य कॉल (यानी गलत संख्या या प्रकार के तर्कों के साथ फ़ंक्शन कॉल) से बचने के लिए है।

मूल सुविधा पर प्रभाव: अच्छी तरह से परिभाषित सुविधा के शब्दार्थ में परिवर्तन। इस सुविधा को सी में "अश्लील" के रूप में चिह्नित किया गया था।

8.5.3 कार्य कहते हैं:

4. पैरामीटर-डिक्लेरेशन-क्लॉज उन तर्कों को निर्धारित करता है जिन्हें निर्दिष्ट किया जा सकता है, और उनके प्रसंस्करण, जब फ़ंक्शन कहा जाता है। [...] यदि पैरामीटर-घोषणा-खंड खाली है, तो फ़ंक्शन कोई तर्क नहीं लेता है। पैरामीटर सूची (शून्य) खाली पैरामीटर सूची के बराबर है।

C99

जैसा कि C ++ 11 द्वारा उल्लेख किया गया है, int f()तर्कों के बारे में कुछ भी नहीं बताता है, और अप्रचलित है।

यह या तो काम कोड या यूबी के लिए नेतृत्व कर सकता है।

मैंने C99 मानक की विस्तार से व्याख्या की है: https://stackoverflow.com/a/36292431/895245


2

सी में, आप एक खाली फ़ंक्शन संदर्भ में एक शून्य का उपयोग करते हैं ताकि संकलक के पास एक प्रोटोटाइप हो, और उस प्रोटोटाइप में "कोई तर्क नहीं" हो। C ++ में, आपको संकलक को यह बताने की ज़रूरत नहीं है कि आपके पास एक प्रोटोटाइप है क्योंकि आप प्रोटोटाइप को छोड़ नहीं सकते हैं।


1
"प्रोटोटाइप" का अर्थ है तर्क सूची घोषणा और वापसी प्रकार। मैं ऐसा इसलिए कहता हूं क्योंकि "प्रोटोटाइप" ने मुझे उलझन में डाल दिया कि आप पहले क्या चाहते थे।
ज़ैन लिंक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.