सी के लिए, सी प्रोग्रामिंग लैंग्वेज (उर्फ के एंड आर) का पहला संस्करण बताता है कि प्रीप्रोसेसर मैक्रोज़ के बारे में आपका अंतर्ज्ञान सही है:
प्रतीकात्मक निरंतर नाम आमतौर पर ऊपरी मामले में लिखे जाते हैं ताकि उन्हें निचले मामले चर नामों से आसानी से अलग किया जा सके।
कई मायनों में, यह असेंबली लैंग्वेज का एक होल्डओवर था, जहां मैक्रोज़ को लेबर्स, ऑपकोड्स, रजिस्टर नेम और बाकी सभी चीज़ों के साथ अपरकेस में परिभाषित किया गया था। एटी एंड टी-स्टाइल असेंबली का आगमन कुछ प्लेटफार्मों पर बदल गया, लेकिन मुझे लगता है कि यह इस तथ्य से बहुत प्रभावित था कि लोअरकेस का समर्थन करने वाले टर्मिनल एक बात बन रहे थे और यूनिक्स वह था जिसे मैं "लोअरकेस ऑपरेटिंग सिस्टम" कहूंगा।
अन्य दो बिंदुओं पर, आप बल्लेबाजी कर रहे हैं। 500:
enum
जब तक दूसरा संस्करण प्रकाशित हुआ, तब तक enum
एस को परिभाषित किया जा चुका था, उन्हें अभिगम स्थिरांक के रूप में संदर्भित किया गया था और स्थिरांक पर अनुभाग में शामिल किया गया था। क्योंकि स्थिरांक द्वारा परिभाषित स्थिरांक enum
प्रतीकों द्वारा दर्शाए जाते हैं, जो उन्हें प्रतीकात्मक स्थिरांक बनाता है, जो कि यदि आप अनुशंसित सम्मेलन का पालन करने जा रहे हैं, तो इसका नाम अपरकेस में रखा जाना चाहिए। (प्रीप्रोसेसर मैक्रोज़ की तरह, कुछ भी आपको अन्यथा करने से नहीं रोकता है।)
इसका निहितार्थ यह है कि कुछ भाषाओं के विपरीत, C enum
एक प्रथम श्रेणी के प्रकार के रूप में व्यवहार नहीं करता है जहां प्रकार स्वयं भिन्न होते हैं, गणन मान प्रत्येक प्रकार के लिए विशिष्ट होते हैं और दूसरों में पुन: उपयोग किए जा सकते हैं। इसके बजाय, यह प्रभावी रूप से एक सुविधाजनक आशुलिपि है #define
जो पूर्णांक के अनुक्रम को पहचानकर्ताओं के साथ जुड़ा हुआ है। यह बनाता है
enum foo { BAR, BAZ };
enum quux { BLETCH, BAZ };
अमान्य है क्योंकि सभी प्रतीकों का दायरा साझा है और BAZ
इसे फिर से परिभाषित किया गया है। (यह प्रीप्रोसेसर पर एक सुधार था, जो उस समय एक #define
क्लोबबेरिंग को दूसरे के बारे में चेतावनी नहीं देता था ।) इसके अलावा, सी को परवाह नहीं है कि क्या आप उन्हें मिलाते हैं क्योंकि वे सभी सिर्फ पूर्णांक हैं,
enum foo { BAR, BAZ };
enum quux { BLETCH, BLRFL };
enum foo variable = BLETCH;
सभी चेतावनी के साथ एक आधुनिक संकलक पर भी पूरी तरह से वैध।
कॉन्स्ट
NB: const
कीवर्ड की उत्पत्ति 1981 में स्ट्रॉस्ट्रुप के सी विद क्लासेस (जो C ++ में विकसित हुई थी) के साथ हुई और अंततः C. द्वारा इसे अपनाया गया। नाम का चुनाव दुर्भाग्यपूर्ण है, क्योंकि यह K & R शब्द के निरंतरता के उपयोग से टकराता है, जिसका अर्थ है कि हम अब कॉल करेंगे शाब्दिक (जैसे 38
, 'x'
या "squabble"
)। दूसरे संस्करण में पाठ को फिर से प्रतिबिंबित करने के लिए नहीं लिखा गया था।
घोषित चर const
एक अलग कहानी है क्योंकि वे अभी भी चर रहे हैं। उन्हें संशोधित नहीं किया जाना चाहिए, लेकिन क्या एक स्थिर चर की धारणा किसी अन्य चर्चा की तुलना में अधिक समझ में आती है, क्या जंबो चिंराट एक और चर्चा के लिए चारा है। जो भी हो, सी वास्तव में कभी भी इसके बारे में गंभीर नहीं था क्योंकि मानक को केवल यह चाहिए कि कंपाइलर एक निदान का उत्सर्जन करता है जब आप एक को बदलने का प्रयास करते हैं। यदि कोई संशोधन संकलित और निष्पादित किया जाता है, तो वास्तविक व्यवहार अपरिभाषित होता है।
चर होने के नाते, यह समझ में आता है कि कुछ भी const
लोअरकेस में नामित होने के सम्मेलन का पालन करेगा। शाब्दिक प्रतिनिधित्व करने के लिए उनका उपयोग करने से कुछ प्रकार के सुरक्षा लाभ होते हैं, लेकिन अच्छे अनुकूलन के लिए नहीं बनता है यदि आपको मूल्य प्राप्त करने के लिए संकलन इकाइयों के बीच पहुंचना है।
वे K & R अर्थों में स्थिरांक नहीं हैं, और इस कारण से उनके पहचानकर्ताओं को अपरकेस नहीं होना चाहिए। कुछ लोग उन्हें इस तरह से उपयोग करते हैं, लेकिन यह कुछ विशिष्ट मामलों को छोड़कर मुझे सलाह नहीं है।
const
पहचानकर्ताओं को निचले मामले और#defines
ऊपरी के रूप में दिखाती हैं । जावा ने हालांकि स्थिरांक और अन्य भाषाओं के लिए ऊपरी मामले को अपनाया, लेकिन मैं उस अंतिम बिट को गलत कर सकता था। अधिक शोध की आवश्यकता है! :)