2008-10-22 11 views
78

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

return __CYGWIN__; 

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

+1

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

उत्तर

107

Programming in C++, Rules and Recommendations से:

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

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

+0

वह मार्गदर्शिका दिखती है जैसे इसे 'नेमस्पेस' पेश करने से पहले लिखा गया था। –

8

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

32

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

+14

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

+0

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

9

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

1

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

अन्य लोगों की तरह, यह नाम टकराव को रोकने में मदद करता है और लाइब्रेरी चर और अपने आप के बीच चित्रण करने में मदद करता है।

46

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

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

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

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

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

+1

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