हां, मुझे पता है कि "cdecl" एक प्रमुख कॉलिंग कन्वेंशन का नाम है, इसलिए कृपया मुझे कॉलिंग कन्वेंशन की व्याख्या न करें। मैं जो पूछ रहा हूं वह संक्षेप में (?) "सीडीईसीएल" वास्तव में क्या है। मुझे लगता है कि यह एक खराब नामकरण विकल्प है, क्योंकि पहली नजर में यह "सी घोषणाकर्ता" (सी का एक अनूठा वाक्य रचनात्मक पहलू) में से एक को याद दिलाता है। वास्तव में, cdecl नामक एक प्रोग्राम है जिसका एकमात्र उद्देश्य सी घोषणाकर्ताओं को समझना है। लेकिन जहां तक ​​​​मैं कह सकता हूं, सी घोषणाकर्ता सिंटैक्स का कॉलिंग सम्मेलनों से कोई लेना-देना नहीं है।

सरलीकृत संस्करण: "stdcall" का अर्थ "मानक कॉलिंग सम्मेलन" है। "सीडीईसीएल" का क्या अर्थ है?

37
fredoverflow 14 फरवरी 2011, 00:00
2
मैंने हमेशा माना कि यह "सी-घोषित" था - अधिकांश सी कंपाइलर डिफ़ॉल्ट रूप से सम्मेलन का उपयोग करते हैं, इसलिए यदि आप संकलित सी कोड को कॉल करना चाहते हैं तो आप कॉलिंग सम्मेलन के रूप में निर्दिष्ट करेंगे।
 – 
Anon.
14 फरवरी 2011, 00:04
5
यह 2011 है। निश्चित रूप से तथ्य यह है कि सामान्य एप्लिकेशन प्रोग्रामर (सिस्टम प्रोग्रामर नहीं) अभी भी विंडोज़ के हास्यास्पद कार्यान्वयन विवरण के बारे में प्रश्न पूछ रहे हैं, विंडोज़ विकास संसाधनों और विंडोज़ की प्लेटफॉर्म के रूप में गुणवत्ता के बारे में बहुत कुछ कहते हैं ...
 – 
R.. GitHub STOP HELPING ICE
14 फरवरी 2011, 04:05
1
@ आर ..: हाँ, यह जावा को विंडोज़ अप्रासंगिक बनाने की डॉट-कॉम भविष्यवाणी को काफी हद तक अस्वीकार करता है।
 – 
MSalters
14 फरवरी 2011, 13:03
2
@ आर .. आप किस "हास्यास्पद कार्यान्वयन विवरण" के बारे में बात कर रहे हैं? मैं बस पूछ रहा था कि नाम कहां से आया है। क्या आपने वास्तव में मेरे प्रश्न को पढ़ने की जहमत उठाई?
 – 
fredoverflow
14 फरवरी 2011, 19:58
5
@ आर .. विंडोज़ विकास संसाधन शानदार हैं। मुझे संदेह है कि आप इस विशेष विषय पर कुछ अज्ञानता की स्थिति से बाहर निकल रहे हैं।
 – 
David Heffernan
14 फरवरी 2011, 20:18

7 जवाब

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

सीडीईसीएल शब्द की उत्पत्ति माइक्रोसॉफ्ट के बेसिक और उनके मिश्रित भाषा प्रोग्रामिंग पारिस्थितिकी तंत्र से हुई है। पारिस्थितिकी तंत्र ने माइक्रोसॉफ्ट की चार प्रमुख भाषाओं (बेसिक, फोरट्रान, पास्कल और सी) में से किसी को भी कॉल करने की अनुमति दी। प्रत्येक भाषा में थोड़ा अलग कॉलिंग सम्मेलन था, और प्रत्येक के पास एक विशिष्ट सम्मेलन का उपयोग करने के लिए बाहरी कार्य या प्रक्रिया घोषित करने का एक तरीका था।

इससे पहले कि आप CALL स्टेटमेंट के साथ बाहरी फ़ंक्शन को कॉल कर सकें, बेसिक में, DECLARE स्टेटमेंट का इस्तेमाल किया जाना था। बाहरी फोरट्रान या पास्कल प्रक्रिया या कार्य को दर्शाने के लिए, आप इनमें से एक लिखेंगे

DECLARE SUB Foo ()
DECLARE FUNCTION Foo ()

सी कॉलिंग सम्मेलन अन्य भाषाओं से भिन्न थे क्योंकि तर्कों को उल्टे क्रम में स्टैक पर धकेल दिया गया था। आप सीडीईसीएल संशोधक जोड़कर इसके बारे में बेसिक को सूचित करेंगे:

DECLARE SUB Foo CDECL ()
DECLARE FUNCTION Foo CDECL ()

इसके विपरीत, फोरट्रान या पास्कल में लिखते समय, संशोधक [सी] होता है। यह एक संकेत है कि सीडीईसीएल बेसिक के DECLARE स्टेटमेंट के लिए विशिष्ट था और पहले से स्थापित शब्द नहीं था। उस समय, "सी कॉलिंग कन्वेंशन" के लिए कोई विशिष्ट शब्द नहीं था। केवल WIN32 (stdcall, fastcall, आदि) में नए कॉलिंग सम्मेलनों के आगमन के साथ ही "cdecl" को सह-चुना गया और एक अन्य शब्द की अनुपस्थिति में विरासत सम्मेलनों को संदर्भित करने के लिए वास्तविक नाम बन गया।

संक्षेप में, सीडीईसीएल का अर्थ है "सी घोषणा"। इसकी उत्पत्ति बेसिक कंपाइलर्स में हुई थी, सी कंपाइलर्स में नहीं, और यह एक मनमाने ढंग से चुने गए बेसिक कीवर्ड थे, और कुछ हद तक बेमानी थे क्योंकि सादा "सी" एक कीवर्ड नहीं हो सकता था।

सीडीईसीएल के बारे में विवरण 1987 के इस दस्तावेज़ में पाया जा सकता है:

https://archive.org/details/Microsoft_Macro_Aassembler_5.1_Mixed_Language_Programming_Guide/page/n1/mode/2up?q=cdecl

2
Curt 4 नवम्बर 2021, 05:01

आप इसमें बहुत ज्यादा पढ़ रहे हैं। यह सामान्य रूप से सी कार्यों को कॉल करने के लिए कार्यान्वयन के कॉलिंग सम्मेलन के लिए खड़ा है (लेकिन विशेष रूप से varargs के साथ महत्वपूर्ण)।

यह किसी ऐसी चीज़ का संक्षिप्त नाम नहीं है जो "C" और "घोषणा" को जोड़ती है; नाम सिर्फ नाम हैं, खासकर प्रोग्रामिंग में। निमोनिक्स मदद करते हैं, लेकिन भले ही "मॉलोक" का अर्थ है "स्मृति आवंटित करें", इसका अतिरिक्त अर्थ है कि हम इसे जानते हैं और इसे संलग्न करते हैं; उदाहरण के लिए, "एलोका" भी "स्मृति आवंटित करता है"।

या "संरचना" लें जिसका "अर्थ" एक "संरचना" है, लेकिन "संरचना" अपने आप में इतनी सामान्य है कि बिना अर्थ के हम अवचेतन रूप से "संरचना" से जुड़ जाते हैं, हम निराशाजनक रूप से खो जाएंगे - क्योंकि अभी भी शब्दावली सीखने वाले नए प्रोग्रामर अक्सर खो जाते हैं। .

17
Fred Nurk 14 फरवरी 2011, 02:49
लेकिन केवल इसका कुछ मतलब होता है... मेरा जवाब देखें
 – 
Peer Stritzinger
14 फरवरी 2011, 16:19
5
@PeerStritzinger: मैंने यह नहीं कहा कि इसका मतलब कुछ भी नहीं है, लेकिन, उह, डाउनवोट के लिए धन्यवाद क्योंकि आपने गलत समझा।
 – 
Fred Nurk
14 फरवरी 2011, 17:03
यह उत्तर एक परिभाषा के साथ व्युत्पत्ति संबंधी प्रश्न का उत्तर दे रहा है। हां, शब्दों का अर्थ उनकी व्युत्पत्ति से परे होता है, लेकिन उनके अभी भी व्युत्पत्ति भी हैं
 – 
user2357112 supports Monica
4 नवम्बर 2021, 03:25

यह सी फ़ंक्शन से आता है जिसे घोषित किया गया था (सी फ़ंक्शन के विपरीत जिसे घोषित नहीं किया गया था जो के एंड आर सी में सामान्य था)।

उस समय यह पास्कल कॉलिंग कन्वेंशन (जहां कैली ने स्टैक को साफ किया) के साथ सह-अस्तित्व में था, इसलिए प्रोग्रामिंग भाषा के बाद इसे कॉल करना समझ में आता है।

सम्मेलन बुलाने के बारे में आप जो कुछ भी जानना चाहते हैं वह सब कुछ।

30
Peer Stritzinger 14 फरवरी 2011, 00:19
3
मुझे यकीन है कि लिंक किया गया पीडीएफ एक दिलचस्प पठन है, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है।
 – 
fredoverflow
14 फरवरी 2011, 00:35
4
क्या उत्तर आपके प्रश्न का उत्तर नहीं देता? "यह एक सी फ़ंक्शन से आता है जिसे घोषित किया गया था"। यानी int main() { char c = 0; f(c); } बाइनरी कोड में एक int, और void f(c) char c; { } पास करता है, भले ही पैरामीटर प्रकार char है, पैरामीटर डेटा को int के रूप में पढ़ने की जरूरत है . यदि आपके पास एक void f(char c) का दायरा और एक void f(char c) { } है, तो डेटा पास किया जाएगा और एक char के रूप में पढ़ा जाएगा।
 – 
Johannes Schaub - litb
14 फरवरी 2011, 02:36
@FredOverflow: लिंक केवल एक अतिरिक्त जानकारी स्रोत के रूप में जोड़ा गया था।
 – 
Peer Stritzinger
14 फरवरी 2011, 16:17
5
@ जोहान्सचौब-लिटब: यह उत्तर केवल तभी समझ में आता है जब सी फ़ंक्शन जो घोषित नहीं किए जाते हैं नहीं सीडीईसीएल कॉलिंग सम्मेलन का उपयोग करते हैं, इसलिए आपके पास इसके विपरीत कुछ था - लेकिन यह गलत है।
 – 
Fred Nurk
14 फरवरी 2011, 17:13
1
@ जोहान्सचौब-लिटब: मैं अभी आपकी पिछली टिप्पणी पर जा रहा हूं। "क्या उत्तर आपके प्रश्न का उत्तर नहीं देता?" => नहीं। पैरामीटर प्रकारों (आपका उदाहरण int और char का उपयोग करता है) के बीच का अंतर सभी कॉलिंग सम्मेलनों के लिए मायने रखता है।
 – 
Fred Nurk
14 फरवरी 2011, 23:08

सी घोषणा। सी द्वारा/के लिए एक घोषणा पेश की गई।

[संपादित करें]

मुझे ईमानदारी से स्वीकार करना होगा कि मैं वास्तव में नहीं जानता कि इसका क्या मतलब है, हालांकि यह वास्तव में सी द्वारा/के लिए पेश किया गया है, लेकिन चूंकि caller को आवंटित स्मृति को साफ करना है (जैसा कि अधिकांश अन्य कॉलिंग के विपरीत है) कन्वेंशन)। यह 'कॉलर डू एंड एंड क्लीनिंग' के लिए एक मुहावरा भी हो सकता है जो मुझे लगता है कि वास्तव में एक अच्छी स्मृति सहायता है। :डी

14
Ramon Zarazua B. 14 फरवरी 2011, 02:45
3
+38 ज़बरदस्त कल्पना के उस टुकड़े के पीछे से! काम मिल जाए तो अच्छा है, पर रात को सोने की कोशिश तो आपको ही करनी पड़ती है !! ;-)
 – 
David Heffernan
14 फरवरी 2011, 00:12
और इसलिए मैंने अपनी प्रोफ़ाइल में अपना आईपी पता दर्ज नहीं किया। ;-)
 – 
GolezTrol
14 फरवरी 2011, 00:15
आपको सभ्य काम करना चाहिए और वह सब प्रतिनिधि वापस देना चाहिए!
 – 
David Heffernan
14 फरवरी 2011, 00:18
5
मुझे "कॉलर डू एंड एंड क्लीनिंग" फिक्शन पसंद है, लेकिन दुर्भाग्य से, "कॉलर" और "कैली" दोनों अक्षर 'सी' से शुरू होते हैं, इसलिए यह वास्तव में मेमोरी सहायता के रूप में काम नहीं करता है :-(
 – 
fredoverflow
14 फरवरी 2011, 00:32
1
मुझे आश्चर्य है कि आप किस उत्तर को पुरस्कृत करना चाहते हैं। आखिर एक ही उत्तर को स्पष्ट करना (यानी cdecl == C declaration) आपका अपना है ....
 – 
4386427
30 अक्टूबर 2021, 04:04

अपडेट किया गया मैंने टिप्पणियों के बाद यह पूरी तरह से संशोधित कर दिया है कि मैं कितना गलत था। cdecl का अर्थ है कि यह फ़ंक्शन उसी कॉलिंग कन्वेंशन का उपयोग करता है जिसका C फ़ंक्शन उपयोग करता है। extern "C" का अर्थ है, इसके अलावा, कि फ़ंक्शन नाम C++ नाम-मैंगलिंग से नहीं गुजरना चाहिए।

इसे cdecl क्यों कहा जाता है, इसके बारे में मुझे और जानकारी नहीं है।

0
TonyK 15 फरवरी 2011, 10:37
1
extern "C", cdecl के समान नहीं है। आप इसे भी बना रहे हैं!
 – 
David Heffernan
14 फरवरी 2011, 00:22
सी ++ फ़ंक्शन भी _cdecl हैं (वास्तव में यह अधिकांश कंपाइलरों पर डिफ़ॉल्ट है जब तक कि यह एक गैर-स्थिर सदस्य फ़ंक्शन न हो, इस मामले में यह _thiscall है)
 – 
Billy ONeal
14 फरवरी 2011, 00:32

सी में कार्यों और चर की अवधारणा है, असेंबलर/मशीन-कोड नहीं है। जब कोई फ़ंक्शन के लिए मानों को पास करना चाहता है, तो इसे या तो सीपीयू रजिस्टरों का उपयोग करके किया जाना चाहिए, या एक रजिस्टर (आमतौर पर नामित स्टैक पॉइंटर) से एक निश्चित ऑफसेट पर मेमोरी में एक मूल्य। इस प्रकार जब हम अपने फ़ंक्शन की शुरुआत में एक नए पते पर जाते हैं, तो सही मान सही जगहों पर होते हैं ताकि फ़ंक्शन सही ढंग से प्रदर्शन कर सके। वही वापसी मूल्यों के लिए लागू होता है।

व्यवहार में यह कैसे काम करता है यह एक दस्तावेज़ में परिभाषित किया गया है जो सिस्टम के कॉलिंग सम्मेलनों का वर्णन करता है। कॉलिंग कन्वेंशन सीपीयू आर्किटेक्चर और ऑपरेटिंग सिस्टम दोनों के लिए कुछ अनोखा है।

X86 विंडोज़ पर कई कॉलिंग कन्वेंशन हैं जिनका उपयोग किया जाता है। "cdecl" कॉलिंग कन्वेंशन में कॉलर कैली के उपयोग के लिए स्टैक पर कार्य करता है। एक बार फ़ंक्शन पूरा हो जाने पर, कॉलर अपने स्वयं के स्टैक को साफ़ करता है।

विंडोज एपीआई "stdcall" कॉलिंग कन्वेंशन का उपयोग करते हैं जो cdelc के समान है सिवाय इसके कि कैली स्टैक को साफ करता है। (इसका मतलब है कि vararg फ़ंक्शन कॉल कॉल का उपयोग नहीं किया जा सकता है)। इसमें कोड स्थान बचाने का लाभ है।

विंडोज़ में एक "फास्टकॉल" कॉलिंग कन्वेंशन भी है जो पैरामीटर पासिंग के लिए रजिस्टरों का उपयोग करता है।

चूंकि विंडोज़ कई कॉलिंग सम्मेलनों की अनुमति देता है, सी कंपाइलर (सीएल) सी भाषा को __cdecl, __stdcall और __fastcall के साथ बढ़ाता है। यह फ़ंक्शन घोषणा को सजाता है और प्रोग्रामर को उपयोग किए गए कॉलिंग सम्मेलन को निर्दिष्ट करने की अनुमति देता है।

एआरएम, इटेनियम और अन्य जैसे अन्य प्लेटफार्मों के अपने कॉलिंग सम्मेलन हैं।

1
Eric Aya 28 अक्टूबर 2021, 18:25

सीडीईसीएल का कोई संक्षिप्त नाम नहीं है, यह सम्मेलन बुलाने के लिए सिर्फ नाम है।

यदि वह वह नहीं था जिसकी आप तलाश कर रहे थे, बल्कि वास्तव में सीडीईसीएल का इतिहास था:

यह एक Microsoft विशिष्ट कॉलिंग कन्वेंशन विशेषता है (1985 और 1995 के बीच कहीं परिचय के समय), जो बाद में मानक बन गई।

इंटरनेट से बहुत खराब पृष्ठ खो गया है (वेबैक में भी कुछ नहीं है), लेकिन जिनके पास पुरानी एमएसडीएन सीडी है उन्हें "सी भाषा संदर्भ" के अंदर "घोषणा का सारांश" विषय मिल सकता है जो स्पष्ट रूप से निम्नलिखित बताता है:

विशेषता-seq : /* विशेषता-seq Microsoft विशिष्ट है */

विशेषता विशेषता-seq ऑप्ट विशेषता : /* Microsoft विशिष्ट */ में से एक

__asm ​​__fastcall __आधारित __इनलाइन __cdecl __stdcall

उसी पुराने MSDN दस्तावेज़ में भी __cdecl

__cdecl होम | अवलोकन | मैं कैसे करूं

माइक्रोसॉफ्ट विशिष्ट ->

यह C और C++ प्रोग्राम के लिए डिफ़ॉल्ट कॉलिंग कन्वेंशन है। क्योंकि कॉलर द्वारा स्टैक को साफ किया जाता है, यह vararg फ़ंक्शन कर सकता है। __cdecl कॉलिंग कन्वेंशन __stdcall की तुलना में बड़े निष्पादन योग्य बनाता है, क्योंकि इसमें स्टैक क्लीनअप कोड शामिल करने के लिए प्रत्येक फ़ंक्शन कॉल की आवश्यकता होती है। निम्नलिखित सूची इस कॉलिंग सम्मेलन के कार्यान्वयन को दर्शाती है।

अन्यथा, हम सब आपके प्रश्न में खो गए हैं (कृपया इसे संशोधित करें);)

0
SoLaR 4 नवम्बर 2021, 00:29