मैंने इस प्रोग्राम को DevC++ पर आजमाया जो दो अलग-अलग प्रकार के फंक्शन को कॉल करेगा, एक रिटर्निंग int और दूसरा रिटर्निंग char। मैं उलझन में हूं कि int फ़ंक्शन को प्रोटोटाइप की आवश्यकता क्यों नहीं है, जबकि char एक और किसी अन्य प्रकार का फ़ंक्शन करता है।

#include <stdio.h>

//int function1();
char function2() ;

int main (){
    int X = function1() ;
    char Y = function2() ;
    
    printf("%d", X) ;
    printf ("%c", Y) ;
    
    return 0 ;
}

int function1(){
    return 100 ;
}

char function2(){
    return 'B' ;
}

उत्पादन:

100B

अगर मैं char फ़ंक्शन के लिए प्रोटोटाइप को हटा देता हूं, तो इसका परिणाम होता है:

[Error] conflicting types for 'function2'
[Note] previous implicit declaration of 'function2' was here
c
6
louisnot 18 अप्रैल 2021, 17:08

3 जवाब

सबसे बढ़िया उत्तर

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

इस निहित int प्रकार की घोषणा को C99 के साथ मानक से हटा दिया गया था। जब आप प्रोटोटाइप के बिना किसी फ़ंक्शन का उपयोग करते हैं तो अब आपको कम से कम अपने कंपाइलर से चेतावनी मिलनी चाहिए।

यदि आपको पहले फ़ंक्शन के लिए कोई नैदानिक ​​संदेश नहीं मिला है, तो आपको अपने कंपाइलर में चेतावनी स्तर को चालू करना चाहिए या प्राचीन संस्करणों के बजाय कम से कम C99 मोड पर स्विच करना चाहिए।

संपादित करें: funcion परिभाषाओं में खाली पैरामीटर सूचियाँ एक पदावनत विशेषता भी है। आपको इसका इस्तेमाल नहीं करना चाहिए। रिटर्न प्रकार और पैरामीटर सूची के साथ प्रत्येक फ़ंक्शन के लिए हमेशा प्रोटोटाइप प्रदान करें।

7
Gerhardh 18 अप्रैल 2021, 17:35

यदि किसी फ़ंक्शन का उपयोग घोषित होने से पहले किया जाता है, तो उपयोग फ़ंक्शन का अंतर्निहित घोषणा बन जाता है। जब कोई फ़ंक्शन f परोक्ष रूप से परिभाषित होता है, तो उसे दी गई परिभाषा int f() होती है, यानी एक ऐसा फ़ंक्शन जो अनिर्दिष्ट संख्या में तर्कों को स्वीकार करता है और एक int देता है।

किसी फ़ंक्शन की यह अंतर्निहित परिभाषा function1 की वास्तविक परिभाषा से मेल खाती है, लेकिन function2 से नहीं। इसलिए function1 को इस तरह कॉल करने से कोई त्रुटि नहीं होती है, लेकिन function2 को कॉल करने का प्रयास करने से इस तरह से निहित परिभाषा वास्तविक परिभाषा से मेल नहीं खाती है, एक त्रुटि दे रही है।

यह व्यवहार C के पूर्व-मानकीकृत संस्करणों पर वापस चला जाता है जहां सभी ऑब्जेक्ट्स (और एक फ़ंक्शन का रिटर्न प्रकार) का डिफ़ॉल्ट प्रकार int होता है यदि घोषित नहीं किया जाता है। यह अभी भी C89 मानक में मौजूद था लेकिन C99 मानक में हटा दिया गया था, हालांकि कुछ कंपाइलर जैसे gcc अभी भी एक विस्तार के रूप में इस अप्रचलित उपयोग का समर्थन करते हैं।

6
dbush 18 अप्रैल 2021, 17:25

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

मुझे यकीन नहीं है कि इसके पीछे कोई वास्तविक तर्क था, लेकिन सी भाषा बी से काफी प्रेरित था। और बी में आपको कार्यों के लिए वापसी प्रकार निर्दिष्ट करने की आवश्यकता नहीं थी। यह वास्तव में सही समझ में आया, क्योंकि केवल एक ही प्रकार था, word

उसी तरह आपको वेरिएबल के प्रकार को भी निर्दिष्ट करने की आवश्यकता नहीं थी। आपने केवल तभी निर्दिष्ट किया है जब उसके पास स्वचालित या स्थिर संग्रहण हो। और यहीं से C में पूरी तरह से बेकार कीवर्ड auto आता है। इसका मतलब सी ++ जैसा नहीं है। इसका मतलब सिर्फ "स्थिर नहीं" है।

3
klutt 18 अप्रैल 2021, 17:24