जवाबों:
में सी :
void foo()
का अर्थ है " foo
अनिर्दिष्ट प्रकार के तर्कों की अनिर्दिष्ट संख्या लेने वाला कार्य " void foo(void)
" foo
कोई तर्क नहीं लेने वाला एक फ़ंक्शन "में सी ++ :
void foo()
" foo
कोई तर्क नहीं लेने वाला एक फ़ंक्शन " void foo(void)
" foo
कोई तर्क नहीं लेने वाला एक फ़ंक्शन "लिख कर foo(void)
, इसलिए, हम दोनों भाषाओं में एक ही व्याख्या को प्राप्त करने और हमारे हेडर बहुभाषी बनाने (हालांकि हम आम तौर पर सही मायने में पार भाषा उन्हें बनाने के लिए हेडर के लिए कुछ और काम करने के लिए की जरूरत है; अर्थात्, उन्हें एक में लपेट extern "C"
अगर हम संकलन सी ++)।
void
, तो वह "सबसे अधिक परेशान करने वाले पार्स" समस्या से बच सकता था।
void foo()
फ़ंक्शन को घोषित करने का एकमात्र सिंटैक्स था। जब हस्ताक्षर जहां प्रस्तुत किए गए थे, सी समिति को पुराने सिंटैक्स से नो-पैरामीटर की अवहेलना करनी थी, और void foo(void)
सिंटैक्स की शुरुआत की । C ++ ने इसे संगतता के लिए लिया।
void foo()
करने के बजाय void foo(void)
एक कार्यात्मक अंतर पैदा करेंगे? यानी मैं कई वर्षों से शून्य के बिना संस्करण का उपयोग कर रहा हूं और किसी भी समस्या को देखा है, क्या मुझे कुछ याद आ रहा है?
void foo() { if ( rand() ) foo(5); }
संकलित करता है और चलाता है (जब तक आप बहुत भाग्यशाली नहीं हैं, तब तक अपरिभाषित व्यवहार करते हैं), जबकि void foo(void)
एक ही शरीर के साथ एक जटिल त्रुटि का कारण होगा।
मुझे पता है कि आपका प्रश्न C ++ से संबंधित है, लेकिन जब C का उत्तर आता है तो K & R, पृष्ठ 72-73 में पाया जा सकता है:
इसके अलावा, अगर एक फ़ंक्शन घोषणा में तर्कों को शामिल नहीं किया जाता है, जैसे कि
double atof();
इसका अर्थ यह भी लिया जाता है कि परमाणु के तर्कों के बारे में कुछ भी नहीं सोचा जाना है; सभी पैरामीटर जाँच बंद है। खाली तर्क सूची के इस विशेष अर्थ का उद्देश्य पुराने सी कार्यक्रमों को नए संकलक के साथ संकलित करने की अनुमति देना है। लेकिन नए कार्यक्रमों के साथ इसका उपयोग करना एक बुरा विचार है। यदि फ़ंक्शन तर्क लेता है, तो उन्हें घोषित करें; यदि यह कोई तर्क नहीं लेता है, तो शून्य का उपयोग करें।
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
सी में, आप एक खाली फ़ंक्शन संदर्भ में एक शून्य का उपयोग करते हैं ताकि संकलक के पास एक प्रोटोटाइप हो, और उस प्रोटोटाइप में "कोई तर्क नहीं" हो। C ++ में, आपको संकलक को यह बताने की ज़रूरत नहीं है कि आपके पास एक प्रोटोटाइप है क्योंकि आप प्रोटोटाइप को छोड़ नहीं सकते हैं।