हां, मुझे पता है कि "cdecl" एक प्रमुख कॉलिंग कन्वेंशन का नाम है, इसलिए कृपया मुझे कॉलिंग कन्वेंशन की व्याख्या न करें। मैं जो पूछ रहा हूं वह संक्षेप में (?) "सीडीईसीएल" वास्तव में क्या है। मुझे लगता है कि यह एक खराब नामकरण विकल्प है, क्योंकि पहली नजर में यह "सी घोषणाकर्ता" (सी का एक अनूठा वाक्य रचनात्मक पहलू) में से एक को याद दिलाता है। वास्तव में, cdecl नामक एक प्रोग्राम है जिसका एकमात्र उद्देश्य सी घोषणाकर्ताओं को समझना है। लेकिन जहां तक मैं कह सकता हूं, सी घोषणाकर्ता सिंटैक्स का कॉलिंग सम्मेलनों से कोई लेना-देना नहीं है।
सरलीकृत संस्करण: "stdcall" का अर्थ "मानक कॉलिंग सम्मेलन" है। "सीडीईसीएल" का क्या अर्थ है?
7 जवाब
सीडीईसीएल शब्द की उत्पत्ति माइक्रोसॉफ्ट के बेसिक और उनके मिश्रित भाषा प्रोग्रामिंग पारिस्थितिकी तंत्र से हुई है। पारिस्थितिकी तंत्र ने माइक्रोसॉफ्ट की चार प्रमुख भाषाओं (बेसिक, फोरट्रान, पास्कल और सी) में से किसी को भी कॉल करने की अनुमति दी। प्रत्येक भाषा में थोड़ा अलग कॉलिंग सम्मेलन था, और प्रत्येक के पास एक विशिष्ट सम्मेलन का उपयोग करने के लिए बाहरी कार्य या प्रक्रिया घोषित करने का एक तरीका था।
इससे पहले कि आप CALL
स्टेटमेंट के साथ बाहरी फ़ंक्शन को कॉल कर सकें, बेसिक में, DECLARE
स्टेटमेंट का इस्तेमाल किया जाना था। बाहरी फोरट्रान या पास्कल प्रक्रिया या कार्य को दर्शाने के लिए, आप इनमें से एक लिखेंगे
DECLARE SUB Foo ()
DECLARE FUNCTION Foo ()
सी कॉलिंग सम्मेलन अन्य भाषाओं से भिन्न थे क्योंकि तर्कों को उल्टे क्रम में स्टैक पर धकेल दिया गया था। आप सीडीईसीएल संशोधक जोड़कर इसके बारे में बेसिक को सूचित करेंगे:
DECLARE SUB Foo CDECL ()
DECLARE FUNCTION Foo CDECL ()
इसके विपरीत, फोरट्रान या पास्कल में लिखते समय, संशोधक [सी] होता है। यह एक संकेत है कि सीडीईसीएल बेसिक के DECLARE स्टेटमेंट के लिए विशिष्ट था और पहले से स्थापित शब्द नहीं था। उस समय, "सी कॉलिंग कन्वेंशन" के लिए कोई विशिष्ट शब्द नहीं था। केवल WIN32 (stdcall, fastcall, आदि) में नए कॉलिंग सम्मेलनों के आगमन के साथ ही "cdecl" को सह-चुना गया और एक अन्य शब्द की अनुपस्थिति में विरासत सम्मेलनों को संदर्भित करने के लिए वास्तविक नाम बन गया।
संक्षेप में, सीडीईसीएल का अर्थ है "सी घोषणा"। इसकी उत्पत्ति बेसिक कंपाइलर्स में हुई थी, सी कंपाइलर्स में नहीं, और यह एक मनमाने ढंग से चुने गए बेसिक कीवर्ड थे, और कुछ हद तक बेमानी थे क्योंकि सादा "सी" एक कीवर्ड नहीं हो सकता था।
सीडीईसीएल के बारे में विवरण 1987 के इस दस्तावेज़ में पाया जा सकता है:
आप इसमें बहुत ज्यादा पढ़ रहे हैं। यह सामान्य रूप से सी कार्यों को कॉल करने के लिए कार्यान्वयन के कॉलिंग सम्मेलन के लिए खड़ा है (लेकिन विशेष रूप से varargs के साथ महत्वपूर्ण)।
यह किसी ऐसी चीज़ का संक्षिप्त नाम नहीं है जो "C" और "घोषणा" को जोड़ती है; नाम सिर्फ नाम हैं, खासकर प्रोग्रामिंग में। निमोनिक्स मदद करते हैं, लेकिन भले ही "मॉलोक" का अर्थ है "स्मृति आवंटित करें", इसका अतिरिक्त अर्थ है कि हम इसे जानते हैं और इसे संलग्न करते हैं; उदाहरण के लिए, "एलोका" भी "स्मृति आवंटित करता है"।
या "संरचना" लें जिसका "अर्थ" एक "संरचना" है, लेकिन "संरचना" अपने आप में इतनी सामान्य है कि बिना अर्थ के हम अवचेतन रूप से "संरचना" से जुड़ जाते हैं, हम निराशाजनक रूप से खो जाएंगे - क्योंकि अभी भी शब्दावली सीखने वाले नए प्रोग्रामर अक्सर खो जाते हैं। .
यह सी फ़ंक्शन से आता है जिसे घोषित किया गया था (सी फ़ंक्शन के विपरीत जिसे घोषित नहीं किया गया था जो के एंड आर सी में सामान्य था)।
उस समय यह पास्कल कॉलिंग कन्वेंशन (जहां कैली ने स्टैक को साफ किया) के साथ सह-अस्तित्व में था, इसलिए प्रोग्रामिंग भाषा के बाद इसे कॉल करना समझ में आता है।
सम्मेलन बुलाने के बारे में आप जो कुछ भी जानना चाहते हैं वह सब कुछ।
int main() { char c = 0; f(c); }
बाइनरी कोड में एक int
, और void f(c) char c; { }
पास करता है, भले ही पैरामीटर प्रकार char
है, पैरामीटर डेटा को int
के रूप में पढ़ने की जरूरत है . यदि आपके पास एक void f(char c)
का दायरा और एक void f(char c) { }
है, तो डेटा पास किया जाएगा और एक char
के रूप में पढ़ा जाएगा।
सी घोषणा। सी द्वारा/के लिए एक घोषणा पेश की गई।
[संपादित करें]
मुझे ईमानदारी से स्वीकार करना होगा कि मैं वास्तव में नहीं जानता कि इसका क्या मतलब है, हालांकि यह वास्तव में सी द्वारा/के लिए पेश किया गया है, लेकिन चूंकि caller
को आवंटित स्मृति को साफ करना है (जैसा कि अधिकांश अन्य कॉलिंग के विपरीत है) कन्वेंशन)। यह 'कॉलर डू एंड एंड क्लीनिंग' के लिए एक मुहावरा भी हो सकता है जो मुझे लगता है कि वास्तव में एक अच्छी स्मृति सहायता है। :डी
अपडेट किया गया मैंने टिप्पणियों के बाद यह पूरी तरह से संशोधित कर दिया है कि मैं कितना गलत था। cdecl
का अर्थ है कि यह फ़ंक्शन उसी कॉलिंग कन्वेंशन का उपयोग करता है जिसका C
फ़ंक्शन उपयोग करता है। extern "C"
का अर्थ है, इसके अलावा, कि फ़ंक्शन नाम C++
नाम-मैंगलिंग से नहीं गुजरना चाहिए।
इसे cdecl
क्यों कहा जाता है, इसके बारे में मुझे और जानकारी नहीं है।
extern "C"
, cdecl
के समान नहीं है। आप इसे भी बना रहे हैं!
_cdecl
हैं (वास्तव में यह अधिकांश कंपाइलरों पर डिफ़ॉल्ट है जब तक कि यह एक गैर-स्थिर सदस्य फ़ंक्शन न हो, इस मामले में यह _thiscall है)
सी में कार्यों और चर की अवधारणा है, असेंबलर/मशीन-कोड नहीं है। जब कोई फ़ंक्शन के लिए मानों को पास करना चाहता है, तो इसे या तो सीपीयू रजिस्टरों का उपयोग करके किया जाना चाहिए, या एक रजिस्टर (आमतौर पर नामित स्टैक पॉइंटर) से एक निश्चित ऑफसेट पर मेमोरी में एक मूल्य। इस प्रकार जब हम अपने फ़ंक्शन की शुरुआत में एक नए पते पर जाते हैं, तो सही मान सही जगहों पर होते हैं ताकि फ़ंक्शन सही ढंग से प्रदर्शन कर सके। वही वापसी मूल्यों के लिए लागू होता है।
व्यवहार में यह कैसे काम करता है यह एक दस्तावेज़ में परिभाषित किया गया है जो सिस्टम के कॉलिंग सम्मेलनों का वर्णन करता है। कॉलिंग कन्वेंशन सीपीयू आर्किटेक्चर और ऑपरेटिंग सिस्टम दोनों के लिए कुछ अनोखा है।
X86 विंडोज़ पर कई कॉलिंग कन्वेंशन हैं जिनका उपयोग किया जाता है। "cdecl" कॉलिंग कन्वेंशन में कॉलर कैली के उपयोग के लिए स्टैक पर कार्य करता है। एक बार फ़ंक्शन पूरा हो जाने पर, कॉलर अपने स्वयं के स्टैक को साफ़ करता है।
विंडोज एपीआई "stdcall" कॉलिंग कन्वेंशन का उपयोग करते हैं जो cdelc के समान है सिवाय इसके कि कैली स्टैक को साफ करता है। (इसका मतलब है कि vararg फ़ंक्शन कॉल कॉल का उपयोग नहीं किया जा सकता है)। इसमें कोड स्थान बचाने का लाभ है।
विंडोज़ में एक "फास्टकॉल" कॉलिंग कन्वेंशन भी है जो पैरामीटर पासिंग के लिए रजिस्टरों का उपयोग करता है।
चूंकि विंडोज़ कई कॉलिंग सम्मेलनों की अनुमति देता है, सी कंपाइलर (सीएल) सी भाषा को __cdecl
, __stdcall
और __fastcall
के साथ बढ़ाता है। यह फ़ंक्शन घोषणा को सजाता है और प्रोग्रामर को उपयोग किए गए कॉलिंग सम्मेलन को निर्दिष्ट करने की अनुमति देता है।
एआरएम, इटेनियम और अन्य जैसे अन्य प्लेटफार्मों के अपने कॉलिंग सम्मेलन हैं।
सीडीईसीएल का कोई संक्षिप्त नाम नहीं है, यह सम्मेलन बुलाने के लिए सिर्फ नाम है।
यदि वह वह नहीं था जिसकी आप तलाश कर रहे थे, बल्कि वास्तव में सीडीईसीएल का इतिहास था:
यह एक Microsoft विशिष्ट कॉलिंग कन्वेंशन विशेषता है (1985 और 1995 के बीच कहीं परिचय के समय), जो बाद में मानक बन गई।
इंटरनेट से बहुत खराब पृष्ठ खो गया है (वेबैक में भी कुछ नहीं है), लेकिन जिनके पास पुरानी एमएसडीएन सीडी है उन्हें "सी भाषा संदर्भ" के अंदर "घोषणा का सारांश" विषय मिल सकता है जो स्पष्ट रूप से निम्नलिखित बताता है:
विशेषता-seq : /* विशेषता-seq Microsoft विशिष्ट है */
विशेषता विशेषता-seq ऑप्ट विशेषता : /* Microsoft विशिष्ट */ में से एक
__asm __fastcall __आधारित __इनलाइन __cdecl __stdcall
उसी पुराने MSDN दस्तावेज़ में भी __cdecl
__cdecl होम | अवलोकन | मैं कैसे करूं
माइक्रोसॉफ्ट विशिष्ट ->
यह C और C++ प्रोग्राम के लिए डिफ़ॉल्ट कॉलिंग कन्वेंशन है। क्योंकि कॉलर द्वारा स्टैक को साफ किया जाता है, यह vararg फ़ंक्शन कर सकता है। __cdecl कॉलिंग कन्वेंशन __stdcall की तुलना में बड़े निष्पादन योग्य बनाता है, क्योंकि इसमें स्टैक क्लीनअप कोड शामिल करने के लिए प्रत्येक फ़ंक्शन कॉल की आवश्यकता होती है। निम्नलिखित सूची इस कॉलिंग सम्मेलन के कार्यान्वयन को दर्शाती है।
अन्यथा, हम सब आपके प्रश्न में खो गए हैं (कृपया इसे संशोधित करें);)
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।