2008-09-09 13 views
200

पर विचार इन दोनों समारोह परिभाषाएँ:क्या सी ++ या सी में foo (शून्य) और foo() के बीच कोई अंतर है?

void foo() { } 

void foo(void) { } 

वहाँ इन दोनों के बीच कोई अंतर है? यदि नहीं, तो void तर्क क्यों है? सौंदर्य कारणों से?

उत्तर

263

में सी:

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

सी ++:

  • void foo() मतलब है
  • void foo(void) का अर्थ है "एक समारोह foo कोई तर्क ले"

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

+4

लेकिन यदि सी ++ को 'शून्य' की आवश्यकता होती है, तो यह "सबसे परेशान पार्स" समस्या से बचा सकता था। –

+4

सच है, लेकिन सी ++ में इतने सारे क्रैपी पार्स हैं कि उनमें से किसी के बारे में कोई बात नहीं है। – DrPizza

+9

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

1

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

+1

"प्रोटोटाइप" तर्क सूची घोषणा का मतलब होता और वापसी प्रकार। मैं यह इसलिए कहता हूं क्योंकि "प्रोटोटाइप" ने मुझे पहले जो मतलब था उसका भ्रमित कर दिया। –

31

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

इसके अलावा, एक समारोह घोषणा तर्क को शामिल नहीं करता है, के रूप में

में
double atof(); 

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

4

सी ++ 11 N3337 मानक प्रारूप

कोई अंतर नहीं है।

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

अनुलग्नक सी "संगतता" सी .1।7 क्लॉज 8: घोषणाकर्ता कहता है:

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

उदाहरण:

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

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

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

8.5.3 कार्यों का कहना है:

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

C99

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

यह या तो काम करने वाले कोड या यूबी का कारण बन सकता है।

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

+0

आपका अंतिम लिंक यहां गलत है; आपने सी # और एक्सएमएल के बारे में किसी प्रश्न पर किसी और के हटाए गए उत्तर से लिंक किया है। –

+0

@MarkAmery धन्यवाद, इसे ठीक किया गया। एक अंक गुम था –

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