C ++ में लोग __ (डबल अंडरस्कोर) का उपयोग क्यों करते हैं


93

मैं कुछ ओपन सोर्स C ++ कोड के माध्यम से देख रहा था और कोड में उपयोग किए जाने वाले स्कोर के तहत बहुत सारे डबल नोटिस करता हूं, मुख्य रूप से चर नामों की शुरुआत में।

return __CYGWIN__;

बस सोच रहा है कि क्या इसके लिए कोई कारण है, या यह सिर्फ कुछ लोगों की कोड शैली है? मुझे लगता है कि मैं इसे पढ़ना मुश्किल बनाता हूं।


2
पढ़ने में मुश्किल क्यों? यह ज्यादातर उद्धरण की तरह, एक परिधि के रूप में डिज़ाइन किया गया है। जैसा कि मुझे याद है, यह मुख्य रूप से बिलिन स्थिरांक के लिए उपयोग किया जाता है।
मैथ्यू शारले

1
नहीं, यह परिसीमन नहीं है। अंडरस्कोर का उपयोग उन नामों से कार्यान्वयन के लिए आरक्षित नामों को अलग करने के लिए किया जाता है, जिनका उपयोग उपयोगकर्ता स्रोत कोड का उपयोग कर सकते हैं। उपयोगकर्ता कर सकते हैं, #define FOO 1लेकिन उन्हें ऐसा नहीं करना चाहिए #define __FOO__ 1और इसलिए कार्यान्वयन __FOO__अपने स्वयं के मैक्रोज़, चर, कार्यों आदि के लिए नाम का उपयोग करने के लिए स्वतंत्र है
जोनाथन वेकली

मुझे लगता है कि मैथ्यू का मतलब यह है कि यह स्टाइलिस्ट / नेत्रहीन एक परिधि है, कार्यात्मक रूप से नहीं। जो एक दिलचस्प परिकल्पना है, लेकिन गलत है जो मैंने पहले पढ़ा है और जोनाथन का जवाब।
जेएमआई मैडिसन

जवाबों:


127

C ++, नियम और अनुशंसाओं में प्रोग्रामिंग से :

पहचानकर्ताओं में दो अंडरस्कोर (`__ ') का उपयोग एएनएसआई-सी मानक के अनुसार संकलक के आंतरिक उपयोग के लिए आरक्षित है।

अंडरस्कोर (`_ ') अक्सर लाइब्रेरी फ़ंक्शंस (जैसे" _main "और" _exit ") के नामों में उपयोग किया जाता है। टकराव से बचने के लिए, एक अंडरस्कोर के साथ एक पहचानकर्ता शुरू न करें।


1
यह मार्गदर्शिका वैसी ही दिखती है जैसी इसे namespaceशुरू करने से पहले लिखी गई थी।
cz

यह शाही कॉलेज के लंदन से भी था, सी ++ मानक से नहीं; यह अच्छा सुझाव हो सकता है।
स्टकैश

1
@cz नामस्थान अप्रासंगिक हैं। एक सिस्टम हेडर एक मैक्रो नाम को परिभाषित कर सकता है जो अंडरस्कोर उदाहरण के साथ शुरू होता है _main
मार्टिंक्यूनेव

49

जब तक उन्हें नहीं लगता कि वे "कार्यान्वयन का हिस्सा" हैं, अर्थात मानक पुस्तकालय, तब उन्हें नहीं करना चाहिए।

नियम काफी विशिष्ट हैं, और कुछ अन्य लोगों द्वारा सुझाए गए की तुलना में थोड़ा अधिक विस्तृत हैं।

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

इसके अलावा, अन्य सभी पहचानकर्ता जो एक अंडरस्कोर के साथ शुरू होते हैं (यानी किसी अन्य अंडरस्कोर या अपरकेस अक्षर का पालन नहीं किया जाता है) वैश्विक दायरे में कार्यान्वयन के लिए आरक्षित हैं। इसका मतलब है कि आप इन पहचानकर्ताओं का उपयोग अपने नामस्थानों या कक्षा परिभाषाओं में कर सकते हैं।

यही कारण है कि Microsoft एक प्रमुख अंडरस्कोर और सभी लोअरकेस में उनके मुख्य रनटाइम लाइब्रेरी फ़ंक्शंस के लिए फ़ंक्शन नाम का उपयोग करता है जो C ++ मानक का हिस्सा नहीं हैं। ये फ़ंक्शन नाम मानक C ++ फ़ंक्शंस या उपयोगकर्ता कोड फ़ंक्शंस के साथ क्लैश न करने की गारंटी हैं।


1
C ++ में मैं केवल [lex.name] और वैश्विक नामों के लिए [global.names] देखता हूं। क्या आप संदर्भ दे सकते हैं? धन्यवाद
a.lasram

36

सी ++ मानक के अनुसार, एक अंडरस्कोर के साथ शुरू होने वाले पहचानकर्ता पुस्तकालयों के लिए आरक्षित हैं। दो अंडरस्कोर के साथ शुरू होने वाले पहचानकर्ता संकलक विक्रेताओं के लिए आरक्षित हैं।


18
इससे अधिक: उनमें कहीं भी एक डबल अंडरस्कोर वाले पहचानकर्ता आरक्षित हैं। 17.4.3.1.2
स्टीव जेसप

C ++ में मैं केवल [lex.name] और वैश्विक नामों के लिए [global.names] देखता हूं। क्या आप संदर्भ दे सकते हैं? धन्यवाद
a.lasram

10

पूर्वगामी टिप्पणियां सही हैं। __Symbol__आम तौर पर आपके सहायक कंपाइलर (या प्रीप्रोसेसर) विक्रेता द्वारा दिया गया एक मैजिक टोकन है। शायद इनमें से सबसे व्यापक रूप से उपयोग किया जाता है __FILE__और __LINE__, जो वर्तमान फ़ाइल नाम और लाइन संख्या को इंगित करने के लिए सी प्रीप्रोसेसर द्वारा विस्तारित हैं। जब आप त्रुटि के पाठ स्थान सहित कार्यक्रम के कुछ प्रकार की विफलता को लॉग करना चाहते हैं, तो यह आसान है।


8

यह कुछ ऐसा है जिसे आप 'सामान्य' कोड में नहीं करते हैं। यह सुनिश्चित करता है कि संकलक और सिस्टम लाइब्रेरी उन प्रतीकों को परिभाषित कर सकते हैं जो आपके साथ नहीं टकराएंगे।


4

डबल अंडरस्कोर कार्यान्वयन के लिए आरक्षित हैं

शीर्ष मतदान ने C ++ में प्रोग्रामिंग का हवाला दिया : नियम और सिफारिशें :

"पहचानकर्ताओं में दो अंडरस्कोर (` __ ') का उपयोग एएनएसआई-सी मानक के अनुसार संकलक के आंतरिक उपयोग के लिए आरक्षित है। "

हालाँकि, कुछ C ++ और C मानकों को पढ़ने के बाद, मैं केवल कंपाइलर के आंतरिक उपयोग तक सीमित किए जा रहे अंडरस्कोर के किसी भी उल्लेख का पता लगाने में असमर्थ था । मानक अधिक सामान्य हैं, कार्यान्वयन के लिए डबल अंडरस्कोर को जलाकर

सी ++

C ++ (वर्तमान कार्य मसौदे, 2019-5-26 तक पहुँचा) में लिखा है lex.name:

  • प्रत्येक पहचानकर्ता जिसमें एक डबल अंडरस्कोर __ होता है या एक अंडरस्कोर के साथ शुरू होता है जिसके बाद एक अपरकेस अक्षर किसी भी उपयोग के लिए कार्यान्वयन के लिए आरक्षित होता है।
  • प्रत्येक पहचानकर्ता जो एक अंडरस्कोर से शुरू होता है, वैश्विक नामस्थान में एक नाम के रूप में उपयोग के लिए कार्यान्वयन के लिए आरक्षित है।

सी

यद्यपि यह प्रश्न C ++ के लिए विशिष्ट है, मैंने C के 99 और 17 मानकों से प्रासंगिक अनुभागों का हवाला दिया है:

C99 खंड 7.1.3

  • सभी पहचानकर्ता जो एक अंडरस्कोर से शुरू होते हैं और या तो एक अपरकेस अक्षर या किसी अन्य अंडरस्कोर को हमेशा किसी भी उपयोग के लिए आरक्षित किया जाता है।
  • सभी पहचानकर्ता जो एक अंडरस्कोर से शुरू होते हैं, हमेशा साधारण और टैग नाम रिक्त स्थान दोनों में फ़ाइल स्कोप वाले पहचानकर्ताओं के रूप में उपयोग के लिए आरक्षित होते हैं।

C17 C99 जैसी ही बात कहता है।

कार्यान्वयन क्या है ?

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

  • पूर्वप्रक्रमक
  • संकलक
  • लिंकर
  • मानक पुस्तकालय

उदाहरण कार्यान्वयन

विकिपीडिया पर विभिन्न C ++ कार्यान्वयनों का उल्लेख किया गया है । (कोई लंगर लिंक, ctrl + f "कार्यान्वयन")

यहाँ डिजिटल मंगल 'C / C ++ कार्यान्वयन का एक उदाहरण है जो उनकी एक विशेषता के लिए कुछ खोजशब्दों को जमा कर रहा है।


3

पुस्तकालयों के अलावा, जिनके बारे में कई अन्य लोगों ने प्रतिक्रिया दी, कुछ लोग प्रीप्रोसेसर के साथ उपयोग के लिए मैक्रोज़ या #define मूल्यों का भी नाम देते हैं। इससे काम करना आसान हो जाएगा, और पुराने कंपाइलरों में बग्स को काम करने की अनुमति मिल सकती है।

दूसरों के उल्लेख की तरह, यह नाम टकराव को रोकने में मदद करता है और पुस्तकालय चर और अपने स्वयं के बीच परिसीमन करने में मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.