संकलक पहेली संकलक के साथ चर / सदस्य शुरू हो सकता है?


12

मुझे हाई स्कूल के बाद से सिखाया जाता है कि इस तरह चर को परिभाषित करना:

int _a;

या

int __a;

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

जहां तक ​​मुझे पता है यही कारण है कि कुछ लोग नाम के अंत में अंडरस्कोर को स्थानांतरित करना पसंद करते हैं, जैसे:

int a_;

हालाँकि, मैं चारों ओर बहुत सारे कोड देखता हूं जो अंडरस्कोर-स्टार्टिंग वेरिएबल्स का उपयोग करता है। और वह कोड Visual Studio 2010 और g ++ 4.x दोनों के साथ काफी अच्छी तरह से बनाता है।

तो मुझे आश्चर्य है: यह आजकल एक गैर-मुद्दा है? क्या आधुनिक संकलक नामकरण सम्मेलनों के बारे में होशियार हैं?


वास्तविक उत्तर नहीं है, लेकिन यह संभावना है कि Microsoft के C ++ कंपाइलर इस बारे में विशेष रूप से अधिक उत्तरदायी हैं क्योंकि यह Microsoft की आंतरिक शैली है जो निजी सदस्य चर (कम से कम C #) में पहले अंडरस्कोर का उपयोग करता है। मुझे पता है कि जी ++ में अभी भी प्रमुख अंडरस्कोर के साथ मुद्दे हो सकते हैं।
KChaloux

6
आपको इस प्रश्न के उत्तर उपयोगी लग सकते हैं।
ब्लरफ्ल

1
@KChaloux अगर आपको लगता है कि Microsoft की C ++ कंपाइलर टीम, 20 से अधिक वर्षों से अस्तित्व में है, तो C # टीम के कुछ लोगों की आदतों के आधार पर स्वीकार्य पहचानकर्ता नामों के बारे में नियम स्थापित किए गए हैं, आप नहीं जानते कि Microsoft कैसे काम करता है :-)। गंभीरता से, यह 21 साल हो गए हैं क्योंकि उन्होंने अपना पहला सी ++ संकलक जारी किया था और ये नियम उस सी या मूल सी संकलक कोडबेस में वापस चले जाते हैं।
केट ग्रेगोरी

@ केट मैं सिर्फ इशारा कर रहा था कि मैं एक तथ्य के लिए जानता था कि उन्होंने इसका उपयोग C # में किया था। मैं Microsoft के C ++ कंपाइलर का उपयोग नहीं करता हूं, या वहां के वातावरण के बारे में बहुत कुछ जानता हूं, इसलिए मैं C # के साथ अपने अनुभव से C ++ में उस नामकरण शैली के उनके उपयोग का उल्लेख कर रहा था। कभी कोई दावा नहीं किया कि C # नियम पहले आया था।
KChaloux

जवाबों:


17

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

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

इसलिए, मूल रूप से, अधिकांश समय इन उपसर्गों का उपयोग करना सुरक्षित होता है, यदि आप उनका उपयोग नहीं करते हैं तो आपके पास 100% गारंटी है कि आपका नाम कार्यान्वयन के नामों के साथ कभी भी संघर्ष नहीं करेगा।

यही कारण है कि, इन उपसर्गों का उपयोग न करें।


3
आपकी टिप्पणी दो अंडरस्कोर के उपसर्ग पर लागू होती है लेकिन एक एकल अंडरस्कोर पर नहीं
केट ग्रेगरी

1
@ केटग्रेरी: एक प्रमुख अंडरस्कोर वाले नाम वैश्विक नामस्थान में नामों के कार्यान्वयन के लिए उपयोग के लिए आरक्षित हैं। एक दूसरे अंडरस्कोर या पूंजी के बाद एक प्रमुख अंडरस्कोर किसी भी उपयोग के लिए आरक्षित है (वे कार्यान्वयन द्वारा मैक्रोज़ के लिए इस्तेमाल किया जा सकता है)। इसलिए, लोअर-केस लेटर के बाद एक प्रमुख अंडरस्कोर स्थानीय स्कोप में ठीक हो सकता है लेकिन आरक्षित नाम का उपयोग करने से बचने और ट्रिप करने से बचने के लिए सबसे अच्छा है।
बार्ट वैन इनगेन शेनॉ

4
@ केटग्रेरी: एक सदस्य के रूप में, _limitएक त्रुटि नहीं है, लेकिन एक वैश्विक कार्य के रूप में यह है। मुझे लगता है कि एक सरल नीति रखना बेहतर है जो कहती है कि "बिना किसी अपवाद के" प्रमुख अंडरस्कोर का उपयोग न करें, एक नीति की तुलना में जो उन्हें कुछ संदर्भों में अनुमति देता है और दूसरों में नहीं। लेकिन हम उस पर अलग होने के लिए सहमत हो सकते हैं। और सिर्फ स्पष्ट होने के लिए, मुझे शुरुआत से ही अन्य स्थानों पर अंडरस्कोर के साथ कोई समस्या नहीं है।
बार्ट वैन इनगेन शेनॉ

2
@BartvanIngenSchenau: सिर्फ ब्याज के लिए: "एक साधारण नीति जैसे" केवल और केवल निजी वर्ग के सदस्यों के लिए अग्रणी अंडरस्कोर का उपयोग करें "तकनीकी समस्याओं को जन्म नहीं देना चाहिए, आपको क्या लगता है, क्या यह सच है?
डॉक ब्राउन

1
@KateGregory बस स्पष्ट करने के लिए, मैं सहमत हूं कि नियम अधिक सटीक हैं कि मैं अपने उत्तर में क्या कह रहा हूं; लेकिन यह मेरी स्मृति की शुद्धता की कमी को दर्शाता है जब मैं यह याद रखने की कोशिश करता हूं कि वास्तव में क्या नियम हैं। जैसा कि मैं अपवादों को जानने से बचता हूं (फीचर नहीं), मैं सामान्य नियमों का पालन करना आसान मानता हूं, विशेष रूप से ऐसे महत्वपूर्ण नियमों के लिए। मजेदार बात यह है कि मुझे यह याद करने की तुलना में मूव शब्दार्थ के साथ अधिक सहजता है। शायद यह मजेदार नहीं है कि मैं इसके बारे में सोचता हूं ...
21

16

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

कुछ लोगों को अंडरस्कोर से नफरत है। चाहे आप कुछ फोन m_indexया highest_priceया _a- वे घृणा यह। मैंने 25 साल पहले किसी ऐसे व्यक्ति के साथ काम किया, जिसने मुझे एक विशिष्ट आईबीएम प्रिंटर (एक बहुत ही लोकप्रिय) के बारे में बताया, जो हर दूसरी पंक्ति पर नीचे के पिक्सेल को छोड़ कर पृष्ठ पर अधिक लाइनें फिट करता है। यह मेमो के लिए, या संख्याओं के बड़े swathes के उत्पादन के लिए ठीक था और इस तरह, लेकिन आपके अंडरस्कोर के आधे को अदृश्य बनाने के कोड के लिए प्रभाव था। (हाँ, वास्तव में!) उस पीढ़ी के लोगों को आमतौर पर तर्कहीन अंडरस्कोर से नफरत होती है, या तो उस प्रिंटर के साथ बातचीत करने से या किसी ऐसे व्यक्ति के साथ काम करने से जो उन लोगों के साथ काम करता है कि अंडरस्कोर का उपयोग नहीं किया जाना है।

अधिकांश लोगों को मिश्रित केस (एक विकल्प हम में नहीं था, कहते हैं, फोरट्रान) अधिक पठनीय दृष्टिकोण का उपयोग कर पाते हैं: mIndex, HighestPrice, aपहले रेखांकित उदाहरण के लिए बहुत अच्छी तरह से खड़े हो जाओ। मैं आपको दो नियम दूंगा:

  • दो अंडरस्कोर के साथ कभी भी कुछ भी (फंक्शन, वैरिएबल, मैक्रो, टाइपडिफ) शुरू न करें
  • एक सुसंगत सम्मेलन (जैसे _limitफ़ंक्शन मापदंडों के लिए, m_limitसदस्य चर के लिए, कभी भी अंडरस्कोर, ऊंट मामले का उपयोग न करें, हर शब्द, हंगेरियन, कुछ को कैपिटल करें ) और उससे चिपके रहें। शुरुआत में कभी-कभी अंडरस्कोर के साथ कभी न काटें, कभी-कभी अंत में, कभी-कभी उनका उपयोग नहीं करने के लिए, और पांच अलग-अलग आवरण सम्मेलनों में। निरतंरता बनाए रखें।

प्रश्न में प्रिंटर लंबे समय से चला गया है। यदि आप समय पर एक अंडरस्कोर का उपयोग करना पसंद करते हैं, तो बेझिझक। लेकिन समझते हैं, अंडरस्कोर नफरत अभी भी मौजूद हैं।


"चाहे आप कुछ m_index या उच्चतम_प्राइस या _a कहते हैं - वे इसे रोकते हैं" बिना कारण नहीं! आपने इस बात का उल्लेख नहीं किया है कि विशेष रूप से पहचानकर्ताओं में अग्रणी अंडरस्कोर के उपयोग से संबंधित मानकों में नियम हैं। जब इतनी आसानी से बचा जाए तो परेशानी क्यों पूछें? stackoverflow.com/a/228797
Max Barraclough

कोई उल्लेख नहीं किया? पहले वाक्य को फिर से पढ़ें।
केट ग्रेगरी

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

1
ठीक है, आप इस बिंदु को याद कर रहे हैं। दूसरा पैराग्राफ उन लोगों के अस्तित्व पर चर्चा कर रहा है जो सामान्य रूप से, विरोधी अंडरस्कोर हैं। अग्रणी अंडरस्कोर नहीं। सभी अंडरस्कोर। हां, यह सच है कि दो अंडरस्कोर के बारे में नियम के अलावा, एक बड़े अक्षर के बाद के अंडरस्कोर के बारे में भी एक नियम है, जो ग्लोबल स्कोप आदि पर अंडरस्कोर करता है, लेकिन इसके अलावा, कुछ लोग वैसे भी अंडरस्कोर से नफरत करते हैं। और वे लोग वही हैं जो मुझे गलत कहना पसंद है। अंडरस्कोरिंग को न करने के लिए कोई मानक-आधारित कारण नहीं है। लेकिन लोग वैसे भी करते हैं।
केट ग्रेगरी

यहीं से हम असहमत हैं। हां, कभी-कभी एकल अंडरस्कोर के साथ एक पहचानकर्ता शुरू करना कानूनी है। जैसा कि मैंने इसे ऊपर रखा है, आग से क्यों खेलते हैं? मैं कभी भी अंडरस्कोर के साथ एक पहचानकर्ता नहीं शुरू करता हूं; मैं इसे एक कोड गंध के रूप में देखता हूं (यदि किसी को एक गंध को देखने के लिए कहा जा सकता है :-P)। इस तरह, मैं नियमों की बारीकियों के बारे में कभी चिंता नहीं करता जो मुझे ठीक से बताते हैं कि ऐसा करना कब कानूनी है।
मैक्स बैरकक्लो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.