फ़ंक्शन () और फ़ंक्शन (शून्य) के बीच अंतर क्या है?


27

मैंने सुना है कि ऐसे कार्यों को लिखना एक अच्छा अभ्यास है जो इस तरह के पैरामीटर के रूप में कुछ भी प्राप्त नहीं करते हैं:

int func(void);

लेकिन मुझे लगता है कि इस तरह से व्यक्त करने का सही तरीका है:

int func();

C और C ++ दोनों में इन दो फ़ंक्शन घोषणाओं के बीच क्या अंतर है?


5
यह साइट नेटवर्क पर एक हजार अन्य प्रश्नों का एक डुप्लिकेट है, दूसरों के बीच stackoverflow.com/questions/18167390/…
लार्स विकलंड

@LarsViklund केवल एक डुप्लिकेट है यदि इस साइट पर कोई प्रश्न है। मुझे एक नहीं मिल रहा है, इसलिए एसओ पर ध्यान दिए बिना, यह डुप्लिकेट नहीं है। शायद इस सवाल को साइनपोस्ट के रूप में चारों ओर रखने के लायक है अगर कुछ और नहीं।


1
@LightnessRacesinOrbit हमने चैट में चर्चा की और इसे कुछ संपादनों के साथ रखने का फैसला किया।

जवाबों:


17

इस संबंध में C और C ++ अलग-अलग हैं।

सी 2011 ऑनलाइन मानक

6.7.6.3 फ़ंक्शन घोषणापत्र (प्रोटोटाइप सहित)
...
10 voidसूची में एकमात्र आइटम के रूप में अनाम पैरामीटर का विशेष मामला निर्दिष्ट करता है कि फ़ंक्शन में कोई पैरामीटर नहीं है।
...
14 एक पहचानकर्ता सूची केवल फ़ंक्शन के मापदंडों के पहचानकर्ता की घोषणा करती है। एक फ़ंक्शन घोषणाकर्ता में एक खाली सूची जो उस फ़ंक्शन की परिभाषा का हिस्सा है, निर्दिष्ट करती है कि फ़ंक्शन का कोई पैरामीटर नहीं है। एक फ़ंक्शन घोषणा में खाली सूची जो उस फ़ंक्शन की परिभाषा का हिस्सा नहीं है, यह निर्दिष्ट करती है कि मापदंडों की संख्या या प्रकारों के बारे में कोई जानकारी नहीं दी गई है। 145)

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

T foo( void ); // declaration, foo takes no parameters
T bar();       // declaration, bar takes an *unspecified* number of parameters

T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... }       // definition, bar takes no parameters

जहाँ तक C का संबंध है, आपको कभी भी किसी फ़ंक्शन की घोषणा या परिभाषा में एक खाली पहचानकर्ता सूची का उपयोग नहीं करना चाहिए । यदि कोई फ़ंक्शन किसी पैरामीटर को लेने के लिए नहीं है, तो निर्दिष्ट करें कि voidपैरामीटर सूची में उपयोग करके ।

ऑनलाइन सी ++ मानक

8.3.5 कार्य [dcl.fct]
...
4 पैरामीटर-घोषणा-खंड उन तर्कों को निर्धारित करता है जिन्हें निर्दिष्ट किया जा सकता है, और उनके प्रसंस्करण, जब फ़ंक्शन कहा जाता है। [ नोट: पैरामीटर-घोषणा-खंड तर्क समारोह कॉल पर निर्दिष्ट कन्वर्ट करने के लिए प्रयोग किया जाता है; 5.2.2 देखें। - अंतिम नोट ] यदि पैरामीटर-घोषणा-खंड खाली है, तो फ़ंक्शन कोई तर्क नहीं लेता है। एक पैरामीटर सूची जिसमें गैर-निर्भर प्रकार voidका एकल अनाम पैरामीटर शामिल है, एक खाली पैरामीटर सूची के बराबर है। इस विशेष मामले को छोड़कर, एक पैरामीटर प्रकार नहीं होगा cv void। यदि पैरामीटर-घोषणा-खंडएक दीर्घवृत्त या एक फ़ंक्शन पैरामीटर पैक (14.5.3) के साथ समाप्त होता है, तर्कों की संख्या उन मापदंडों की संख्या के बराबर या उससे अधिक होगी जो डिफ़ॉल्ट तर्क नहीं रखते हैं और फ़ंक्शन पैरामीटर पैक नहीं हैं। जहां वाक्यगत रूप से सही है और जहां "..." एक सार-घोषणाकर्ता का हिस्सा नहीं है , "... ..." का पर्याय है "..."। [ उदाहरण: घोषणा
    int printf(const char*, ...);
एक फ़ंक्शन की घोषणा करता है जिसे अलग-अलग संख्याओं और प्रकार के तर्कों के साथ बुलाया जा सकता है।
    printf("hello world");
    printf("a=%d b=%d", a, b);
हालाँकि, पहला तर्क एक प्रकार का होना चाहिए जिसे एक const char*- अंतिम उदाहरण में परिवर्तित किया जा सकता है ] [ नोट: मानक हेडर <cstdarg>में दीर्घवृत्त का उपयोग करके पारित तर्कों तक पहुँचने के लिए एक तंत्र होता है (5.2.2 और 18.10 देखें)। - अंतिम नोट ]

C ++ के मामले में, एक डिक्लेरेशन या डेफिनिशन में एक खाली पैरामीटर सूची इंगित करती है कि फ़ंक्शन कोई तर्क नहीं लेता है, और पैरामीटर सूची का उपयोग करने के बराबर है void


35

सी में, एक खाली पैरामीटर सूची वाला फ़ंक्शन अपने तर्कों के लिए कुछ भी() ले सकता है। सचमुच कुछ भी। यह आमतौर पर एक फ़ंक्शन को लागू करने के लिए उपयोग किया जाता है जो एक चर संख्या में तर्क ले सकता है , हालांकि इन दिनों इन कार्यों के लिए अधिक स्पष्ट दीर्घवृत्त वाक्यविन्यास का उपयोग करना बेहतर माना जाता है ।(...)

सी में, पैरामीटर सूची के साथ एक फ़ंक्शन (void)स्पष्ट रूप से इसके तर्कों के लिए कुछ भी नहीं लेता है। इसका मतलब है कि कंपाइलर वास्तव में आपको बता सकता है कि अगर आपने कुछ पास करने की कोशिश की है तो आपसे गलती हुई है।

C ++ में, ये फ़ंक्शन घोषणाएँ समकक्ष हैं। एक रिक्त पैरामीटर सूची का अर्थ है "कोई पैरामीटर नहीं" जैसा कि voidहोता है।


पुन: "यह आमतौर पर एक फ़ंक्शन को लागू करने के लिए उपयोग किया जाता है जो एक चर संख्या में तर्क ले सकता है": क्या आप इस बारे में निश्चित हैं? मुझे नहीं लगता कि मैंने कभी ऐसा कार्यक्रम देखा है, जिसमें गैर-वैरादिक कार्यों के फॉरवर्ड-डिक्लेरेशन के लिए स्पष्ट पैरामीटर-सूचियों का उपयोग किया गया हो और ()जो वैरिएड वाले हैं। क्या आपके पास एक कार्यक्रम का उदाहरण है जो इस सम्मेलन का उपयोग करता है?
बरबाद

4
AC वैरिएड फ़ंक्शन को... सिंटैक्स के साथ परिभाषित किया जाना चाहिए , और इसमें कम से कम एक नामित पैरामीटर होना चाहिए। ()अपरिभाषित व्यवहार के कारण ऐसे फ़ंक्शन को परिभाषित करना - और <stdarg.h>पैरामीटर मानों को पढ़ने के लिए फ़ंक्शन के शरीर के लिए मैक्रो का उपयोग करने का कोई तरीका नहीं है । 1989/1990 के मानक के बाद से यह मामला रहा है।
कीथ थॉम्पसन

@KeithThompson: यह प्रश्न, और यह उत्तर, पूर्वनिर्धारणों के बारे में बात कर रहे हैं, न कि कार्य परिभाषा।
रुख करें

3
@ruakh: अपरिभाषित व्यवहार से बचने के लिए वाक्य विन्यास का उपयोग करते हुए एक वैराडिक फ़ंक्शन को घोषित और परिभाषित किया जाना चाहिए ...
कीथ थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.