2010-06-22 15 views
34

के & आर फ़ंक्शन घोषणा और एएनएसआई फ़ंक्शन घोषणा के बीच अंतर क्या हैं?फ़ंक्शन घोषणा: के एंड आर बनाम एएनएसआई

+1

क्या आप प्रत्येक शैली का उदाहरण दे सकते हैं? –

+2

एक संबंधित प्रश्न: http://stackoverflow.com/questions/1630631/what-is-useful-about-this-c-syntax – sharptooth

+1

यह "के एंड आर" है, न कि "knr" (मैंने आपके लिए प्रश्न तय कर लिया है) , जो कि केर्निगान और रिची के लिए खड़ा है और आमतौर पर सी सर्का 1 9 78, * सी प्रोग्रामिंग भाषा * पर उनकी मौलिक पुस्तक में वर्णित सी वाक्यविन्यास को संदर्भित करता है। यह आलेख आपके लिए उपयोगी हो सकता है: http://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C –

उत्तर

54

के & आर वाक्यविन्यास अप्रचलित है, आप इसे तब तक छोड़ सकते हैं जब तक आपको बहुत पुराना कोड बनाए रखना न पड़े।

// K&R syntax 
int foo(a, p) 
    int a; 
    char *p; 
{ 
    return 0; 
} 

// ANSI syntax 
int foo(int a, char *p) 
{ 
    return 0; 
} 
+13

'शून्य *' प्रकार के साथ के एंड आर वाक्यविन्यास का उपयोग करना एक अनाचारवाद है, क्योंकि के एंड आर सी ने * * 'शून्य *' है। – caf

+3

@caf नहीं, मैं भाषा के लिए एक गैर-मानक विस्तार का उपयोग कर रहा था :-) – Wizard

+3

असल में, यह एक के एंड आर फ़ंक्शन परिभाषा है, न कि के एंड आर फ़ंक्शन घोषणा। –

19

विरासत कश्मीर & आर-शैली घोषणा/परिभाषाएं

जब Kernighan और रिची पहली बार प्रकाशित "सी प्रोग्रामिंग भाषा", सी अभी तक पूर्ण समारोह प्रोटोटाइप नहीं की। कार्यों की अग्रेषित घोषणाएं मौजूद थीं, लेकिन रिटर्न प्रकार को इंगित करने के एकमात्र उद्देश्य के साथ। int लौटाए गए कार्यों के लिए, उन्हें C99 तक आवश्यक नहीं था।

सी 8 9 द्वारा, फ़ंक्शन प्रोटोटाइप की धारणा, जो पैरामीटर के प्रकारों को निर्दिष्ट करती है (और, निश्चित रूप से, उनकी संख्या) को जोड़ा गया था। चूंकि प्रोटोटाइप फ़ंक्शन घोषणा का एक प्रकार भी है, अनौपचारिक शब्द "के & आर फ़ंक्शन घोषणा" कभी-कभी फ़ंक्शन घोषणा के लिए उपयोग किया जाता है जो प्रोटोटाइप भी नहीं होता है।

// K&R declarations, we don't know whether these functions have parameters. 
int foo(); // this declaration not strictly necessary until C99, because it returns int 
float bar(); 

// Full prototypes, specifying the number and types of parameters 
int foo(int); 
float bar(int, float); 

// K&R definition of a function 
int foo(a) 
    int a; // parameter types were declared separately 
{ 
    // ... 
    return 0; 
} 

// Modern definition of a function 
float bar(int a, float b) 
{ 
    // ... 
    return 0.0; 
} 

दुर्घटना कश्मीर & आर घोषणा

यह ध्यान देने योग्य है कि सी के लिए नए चेहरे गलती से कश्मीर & आर घोषणाओं का उपयोग कर सकते हैं जब वे एक पूर्ण प्रोटोटाइप उपयोग करना चाहते हैं, क्योंकि वे एक खाली कि एहसास नहीं हो सकता लायक है पैरामीटर सूची void के रूप में निर्दिष्ट की जानी चाहिए।

आप घोषित करने और

// Accidental K&R declaration 
int baz(); // May be called with any possible set of parameters 

// Definition 
int baz() // No actual parameters means undefined behavior if called with parameters. 
      // Missing "void" in the parameter list of a definition is undesirable but not 
      // strictly an error, no parameters in a definition does mean no parameters; 
      // still, it's better to be in the habit of consistently using "void" for empty 
      // parameter lists in C, so we don't forget when writing prototypes. 
{ 
    // ... 
    return 0; 
} 

के रूप में एक समारोह को परिभाषित है ... तो आपने वास्तव में एक समारोह है कि कोई पैरामीटर लेता है के लिए एक प्रोटोटाइप दे दिया है, लेकिन एक समारोह के लिए K & आर-शैली में एक घोषणा जो अज्ञात प्रकार के पैरामीटर की अज्ञात संख्या स्वीकार करता है।

एएनटी this answer में एक समान प्रश्न के लिए नोट करता है कि यह वाक्यविन्यास बहिष्कृत है लेकिन अभी भी सी 99 के रूप में कानूनी है (और अज्ञात संख्या और पैरामीटर के प्रकार के साथ फ़ंक्शन पॉइंटर्स के पास अभी भी संभावित अनुप्रयोग हैं, हालांकि अपरिभाषित व्यवहार के उच्च जोखिम पर) ; इस प्रकार, अनुपालन कंपाइलर्स, सर्वोत्तम रूप से, एक उचित प्रोटोटाइप के बिना एक समारोह घोषित या बुलाए जाने पर चेतावनी उत्पन्न करेंगे।

प्रोटोटाइप के बिना कॉलिंग फ़ंक्शंस कम सुरक्षित है, क्योंकि संकलक यह सत्यापित नहीं कर सकता कि आपने सही क्रम में सही संख्या और पैरामीटर के प्रकार पारित किए हैं; अपरिभाषित व्यवहार परिणाम अगर कॉल वास्तव में सही नहीं है।

घोषित करने और परिभाषित एक parameterless समारोह ज़ाहिर है, है करने के लिए सही तरीका:

// Modern declaration of a parameterless function. 
int qux(void); // "void" as a parameter type means there are no parameters. 
       // Without using "void", this would be a K&R declaration. 

// Modern definition of a parameterless function 
int qux(void) 
{ 
    // ... 
    return 0; 
} 
+1

आपको 'सी के पुराने संस्करण' से क्या मतलब है, यह स्पष्ट करने की आवश्यकता है। आप कहते हैं: _ सी भाषा के पुराने संस्करणों को पूर्ण फ़ंक्शन प्रोटोटाइप की आवश्यकता नहीं थी, लेकिन इसे अभी भी एक फ़ंक्शन की अगली घोषणा की आवश्यकता हो सकती थी ._ लेकिन सी के पुराने संस्करण, जिसका मतलब पूर्व-मानक सी नहीं था, प्रोटोटाइप बिल्कुल और किसी फंक्शन की अगली घोषणा की आवश्यकता नहीं होने से पहले उसे कॉल किया जा सकता था। यहां तक ​​कि सी 8 9/सी 0 9 को ऐसी अगली घोषणाओं की आवश्यकता नहीं थी। यह सी 99 था जिसके उपयोग से पहले कार्यों की घोषणा की आवश्यकता थी (लेकिन प्रोटोटाइप को अनिवार्य नहीं है)। –

+0

@ जोनाथन लेफ्लर सुझावों के लिए धन्यवाद, मैंने थोड़ा और (मुख्य रूप से के एंड आर युग सी पर विकिपीडिया लेख) पढ़ा है और इसे साफ़ कर लिया है, मुझे लगता है कि यह अब ऐतिहासिक रूप से सटीक होना चाहिए। –

0

मैं सिर्फ कार्यों है कि एक int मूल्य वापस नहीं कर रहे के लिए जोड़ने के लिए है कि पारंपरिक कश्मीर & आर शैली प्रकार संशोधक में चाहता हूँ ' टी भी जरूरी है।

int main(int argc, char **argv) { 
    printf("hello world\n"); 
    return 0; 
} 

यह कश्मीर & आर अंकन शैली के बराबर है:

एक सरल HelloWorld कार्यक्रम के आधुनिक C11 अंकन पर विचार करें

main(argc, argv) 
int argc; 
char **argv; 
{ 
printf("hello world\n"); 
return 0; 
} 

ध्यान दें कि intmain() से पहले नजरअंदाज कर दिया है, लेकिन कोड अभी भी संकलित करता है। यह K& आर परिभाषा का एक हिस्सा है।

उद्धरण विकिपीडिया:

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

--source: https://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C

यकीनन यह एक विरासत कोडिंग शैली है और स्पष्टता मुद्दों की वजह से बचा जाना चाहिए, लेकिन अक्सर पुराने एल्गोरिथ्म पाठ्यपुस्तकों कश्मीर & आर शैली की इस तरह पक्ष में हैं।

+2

और मासोकिस्टिक के लिए, आप 'मुख्य (argc, argv) char ** argv; {...} 'स्पष्ट प्रकार के विनिर्देश के बिना तर्कों के प्रकार के रूप में, अनुमान के अनुसार, 'int' था। इसके अलावा, 'फ़ंक्शन (ए, बी, सी, डी) चार * डी, डबल सी, ए; {...} 'ठीक था; नामों को क्रम में अनुभाग में सूचीबद्ध करने की आवश्यकता नहीं थी ताकि वे तर्क सूची में दिखाई दें। –

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