के & आर फ़ंक्शन घोषणा और एएनएसआई फ़ंक्शन घोषणा के बीच अंतर क्या हैं?फ़ंक्शन घोषणा: के एंड आर बनाम एएनएसआई
उत्तर
के & आर वाक्यविन्यास अप्रचलित है, आप इसे तब तक छोड़ सकते हैं जब तक आपको बहुत पुराना कोड बनाए रखना न पड़े।
// K&R syntax
int foo(a, p)
int a;
char *p;
{
return 0;
}
// ANSI syntax
int foo(int a, char *p)
{
return 0;
}
विरासत कश्मीर & आर-शैली घोषणा/परिभाषाएं
जब 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;
}
आपको 'सी के पुराने संस्करण' से क्या मतलब है, यह स्पष्ट करने की आवश्यकता है। आप कहते हैं: _ सी भाषा के पुराने संस्करणों को पूर्ण फ़ंक्शन प्रोटोटाइप की आवश्यकता नहीं थी, लेकिन इसे अभी भी एक फ़ंक्शन की अगली घोषणा की आवश्यकता हो सकती थी ._ लेकिन सी के पुराने संस्करण, जिसका मतलब पूर्व-मानक सी नहीं था, प्रोटोटाइप बिल्कुल और किसी फंक्शन की अगली घोषणा की आवश्यकता नहीं होने से पहले उसे कॉल किया जा सकता था। यहां तक कि सी 8 9/सी 0 9 को ऐसी अगली घोषणाओं की आवश्यकता नहीं थी। यह सी 99 था जिसके उपयोग से पहले कार्यों की घोषणा की आवश्यकता थी (लेकिन प्रोटोटाइप को अनिवार्य नहीं है)। –
@ जोनाथन लेफ्लर सुझावों के लिए धन्यवाद, मैंने थोड़ा और (मुख्य रूप से के एंड आर युग सी पर विकिपीडिया लेख) पढ़ा है और इसे साफ़ कर लिया है, मुझे लगता है कि यह अब ऐतिहासिक रूप से सटीक होना चाहिए। –
मैं सिर्फ कार्यों है कि एक 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;
}
ध्यान दें कि int
main()
से पहले नजरअंदाज कर दिया है, लेकिन कोड अभी भी संकलित करता है। यह K& आर परिभाषा का एक हिस्सा है।
उद्धरण विकिपीडिया:
सी के प्रारंभिक संस्करणों, केवल कार्यों कि घोषित किया जा करने के लिए आवश्यक एक गैर पूर्णांक मान दिया है, तो इससे पहले कि समारोह परिभाषा का इस्तेमाल किया है; किसी भी पिछले घोषणा के बिना इस्तेमाल किया गया एक फ़ंक्शन वापस टाइप int int माना जाता था, यदि इसका मान उपयोग किया गया था।
--source: https://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C
यकीनन यह एक विरासत कोडिंग शैली है और स्पष्टता मुद्दों की वजह से बचा जाना चाहिए, लेकिन अक्सर पुराने एल्गोरिथ्म पाठ्यपुस्तकों कश्मीर & आर शैली की इस तरह पक्ष में हैं।
और मासोकिस्टिक के लिए, आप 'मुख्य (argc, argv) char ** argv; {...} 'स्पष्ट प्रकार के विनिर्देश के बिना तर्कों के प्रकार के रूप में, अनुमान के अनुसार, 'int' था। इसके अलावा, 'फ़ंक्शन (ए, बी, सी, डी) चार * डी, डबल सी, ए; {...} 'ठीक था; नामों को क्रम में अनुभाग में सूचीबद्ध करने की आवश्यकता नहीं थी ताकि वे तर्क सूची में दिखाई दें। –
- 1. प्रोटोटाइप बनाम फंक्शन घोषणा के लिए वैकल्पिक (के एंड आर) सी वाक्यविन्यास
- 2. के एंड आर
- 3. शुरुआती के एंड आर
- 4. एंड() फ़ंक्शन
- 5. शब्दावली: फॉरवर्ड घोषणा बनाम फ़ंक्शन प्रोटोटाइप
- 6. के एंड आर सी से एएनएसआई सी में कैसे परिवर्तित करें?
- 7. क्या विज़ुअल सी ++ के साथ प्री-एएनएसआई (के एंड आर-स्टाइल) सी कोड संकलित करना संभव है?
- 8. सी प्रोग्रामिंग व्यायाम के एंड आर बुक
- 9. के एंड आर: वर्ण पॉइंटर्स की सरणी
- 10. के एंड आर व्यायाम 1.16 - लाइन लंबाई
- 11. जावास्क्रिप्ट फ़ंक्शन घोषणा
- 12. सी फ़ंक्शन घोषणा
- 13. वर बनाम स्पष्ट घोषणा
- 14. एएनएसआई सी समारोह की घोषणा पुराने कर्निगन और रिची शैली में सुधार कैसे है?
- 15. स्थिरांक टी एंड टी बनाम &&
- 16. के एंड आर: अध्याय 6 - क्यों getword() फ़ंक्शन ईओएफ नहीं पढ़ता है?
- 17. फ़ंक्शन घोषणा के बाद "->" क्या है?
- 18. रेल एंड एंड-यूजर टेम्पलेटिंग इंजन: तरल बनाम मूंछ बनाम अन्य?
- 19. क्या मुझे के एंड आर में सभी अभ्यास करना चाहिए?
- 20. "के एंड आर सी" अभी भी लागू है
- 21. आर लेखन शैली - बनाम ::
- 22. एंटर ग्लोबल नियम स्कोप घोषणा बनाम @ मेम्बर्स घोषणा
- 23. आर: एक आंतरिक फ़ंक्शन
- 24. आर पाइपलाइनिंग फ़ंक्शन
- 25. आर - फ़ंक्शन ओवरलोडिंग
- 26. आर बनाम Pentaho चम्मच
- 27. कोको/आर बनाम एएनटीएलआर
- 28. आर MATLAB के फ़िल्टर फ़ंक्शन के समतुल्य
- 29. आर-फोर्ज बनाम रूफोर्ज?
- 30. आर: संख्यात्मक बनाम संख्यात्मक
क्या आप प्रत्येक शैली का उदाहरण दे सकते हैं? –
एक संबंधित प्रश्न: http://stackoverflow.com/questions/1630631/what-is-useful-about-this-c-syntax – sharptooth
यह "के एंड आर" है, न कि "knr" (मैंने आपके लिए प्रश्न तय कर लिया है) , जो कि केर्निगान और रिची के लिए खड़ा है और आमतौर पर सी सर्का 1 9 78, * सी प्रोग्रामिंग भाषा * पर उनकी मौलिक पुस्तक में वर्णित सी वाक्यविन्यास को संदर्भित करता है। यह आलेख आपके लिए उपयोगी हो सकता है: http://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C –