एट्रिब्यूट्स C++ में चीजों को मानकीकृत करने के आधुनिक तरीके हैं यदि उनका कोड विभिन्न कंपाइलर्स पर चलता है। एट्रिब्यूट्स का उपयोग कुछ अतिरिक्त जानकारी प्रदान करने के लिए किया जाता है जिसका उपयोग शर्तों (बाधाओं), ऑप्टिमाइज़ेशन और आवश्यकता होने पर विशिष्ट कोड जनरेशन को लागू करने के लिए किया जाता है।
ये कंपाइलर्स के लिए एक सूचना मैनुअल की तरह हैं जो कुछ लागू करने के लिए करते हैं जिससे कोड के प्रदर्शन में सुधार होगा। एट्रिब्यूट्स पहली बार C++ 11 में देखे गए और तब से प्रोग्रामिंग भाषा के महत्वपूर्ण हिस्से हैं। साथ ही, हर संस्करण के साथ उन्हें अधिक शक्तिशाली और बेहतर बनाने के लिए लगातार संशोधन किए जाते हैं।
C++ में एट्रिब्यूट्स कैसे परिभाषित करें
C++ के विभिन्न संस्करणों के लिए, एट्रिब्यूट्स को परिभाषित करने का सिंटैक्स अलग है।
C++ 11 में एट्रिब्यूट बनाने का सिंटैक्स:
[[attribute-list]]
C++ 17 में एट्रिब्यूट बनाने का सिंटैक्स:
[[using attribute-namespace : attribute_list]]
C++ 20 में एट्रिब्यूट बनाने का सिंटैक्स (जल्द ही प्रकाशित होगा):
[[contract-attriubute-token contract-level-identifier : expression]]
आप वेरिएबल्स, फ़ंक्शन्स, क्लासेस के साथ कई एट्रिब्यूट्स का उपयोग कर सकते हैं।
अब, चूंकि हम जानते हैं कि एट्रिब्यूट्स क्या हैं, वे कैसे काम करते हैं, और उन्हें कैसे परिभाषित किया जाता है। आइए C++ में उपलब्ध विभिन्न स्टैंडर्ड एट्रिब्यूट्स देखें।
C++ 11 में पेश किए गए एट्रिब्यूट्स
noreturn - यह एट्रिब्यूट कंपाइलर को बताने के लिए उपयोग किया जाता है कि फ़ंक्शन कोई मान नहीं लौटाता।
सिंटैक्स
[[noreturn]]
उदाहरण
[[noreturn]] void f();
यह फ़ंक्शन कोई मान नहीं लौटाएगा, यहां तक कि void भी नहीं।
C++ में उपयोग किया जाने वाला noreturn एट्रिब्यूट, कंपाइलर को चेतावनी लौटाने में सक्षम बनाता है यदि कुछ गलत होता है और फ्लो कॉलिंग कोड पर वापस नहीं जाता, जैसे अनंत लूप या किसी त्रुटि के मामले में।
carries_dependency - यह रिलीज़-कंज़्यूम में मौजूद सभी निर्भरताओं को परिभाषित करने के लिए उपयोग किया जाता है और कंपाइलर को अनावश्यक मेमोरी-खपत निर्देशों से न गुजरकर ऑप्टिमाइज़ करने की अनुमति देता है।
सिंटैक्स
[[carries_dependency]]
यह मुख्य रूप से फ़ंक्शन्स या पैरामीटर्स की घोषणाओं के साथ निर्भरता घोषित करने के लिए उपयोग किया जाता है।
deprecated - यह कोड में एक डिप्रिकेटेड एंटिटी को परिभाषित करने के लिए उपयोग किया जाता है। इस डिप्रिकेटेड एंटिटी का उपयोग अनुमत है लेकिन इसकी अनुशंसा नहीं की जाती है।
सिंटैक्स
[[deprecated]] [[deprecated (reason)]]
reason एक स्ट्रिंग है जो डिप्रिकेशन का कारण बताती है और डिप्रिकेटेड एंटिटी के लिए एक विकल्प भी प्रदान करती है।
जिन एंटिटीज को डिप्रिकेट किया जा सकता है वे हैं: क्लास, स्ट्रक्चर, यूनियन, टाइपडेफ-नाम, स्टेटिक मेंबर्स, फ़ंक्शन्स, नेमस्पेस, एन्यूमरेशन।
fallthrough - यह कंपाइलर को इंगित करने के लिए उपयोग किया जाता है कि अगले केस में फॉलथ्रू जानबूझकर है, इसके कारण कंपाइलर फॉलथ्रू की चेतावनी नहीं देता।
सिंटैक्स
[[fallthrough]]
फॉलथ्रू का उपयोग केवल स्विच के साथ किया जा सकता है क्योंकि इसके लिए अगला केस परिभाषित होता है।
nodiscard - यह एक फ़ंक्शन के लिए उपयोग किया जाता है जो एक एन्यूमरेशन लौटाएगा जिसे डिस्कार्डेड वैल्यू एक्सप्रेशन से कॉल किया जाएगा बजाय void में कास्ट करने के। कंपाइलर इसके लिए चेतावनी भी जारी करेगा।
सिंटैक्स
[[nodiscard]] [[nodiscard (reason)]] (C++ 20 में जोड़ा गया)
reason एक स्ट्रिंग है जिसका उपयोग परिणाम को डिस्कार्ड न करने का कारण प्रदान करने के लिए किया जाता है और यह C++ 20 में शामिल होगा।
maybe_unused - यह कंपाइलर को अनुपयोगी एंटिटीज के मामले में प्रदर्शित होने वाली चेतावनी को दबाने या समाप्त करने के लिए बताने के लिए उपयोग किया जाता है।
सिंटैक्स
[[maybe_unused]]
जिन एंटिटीज को maybe_unused घोषित किया जा सकता है वे हैं: क्लास, स्ट्रक्चर, यूनियन, टाइपडेफ-नाम, स्टेटिक मेंबर्स, फ़ंक्शन्स, वेरिएबल्स, एन्यूमरेशन।
likely, unlikely - इनका उपयोग यह परिभाषित करने के लिए किया जाता है कि वैकल्पिक पथ वर्तमान निष्पादन की तुलना में अधिक या कम संभावित है।
सिंटैक्स
[[likely]] [[unlikely]]
ये आमतौर पर उन एंटिटीज पर लागू होते हैं जो प्रोग्राम के फ्लो को बदलते हैं जैसे लेबल और स्टेटमेंट्स।
no_unique_address - यह एक डेटा-मेंबर को परिभाषित करने के लिए उपयोग किया जाता है जिसका एक विशिष्ट पता होना आवश्यक नहीं है। यह आमतौर पर नॉन-स्टेटिक डेटा मेंबर्स को परिभाषित करने के मामले में उपयोग किया जाता है जिनके मेमोरी आवंटन की आवश्यकता नहीं होती।
सिंटैक्स
[[no_unique_address]]
यह तब उपयोगी होता है जब कंपाइलर को एक सामान्य और no_unique_address वेरिएबल के बीच मेमोरी लोकेशन असाइन करना होता है तो कंपाइलर पूर्व वाले को प्राथमिकता देगा।
optimize_for_synchronized - यह परिभाषित करने के लिए उपयोग किया जाता है कि दिए गए फ़ंक्शन की परिभाषा को सिंक्रोनाइज़्ड स्टेटमेंट से आह्वान के लिए ऑप्टिमाइज़ किया जाना है।
सिंटैक्स
[[optimize_for_synchronized]]
optimize_for_synchronized के रूप में परिभाषित फ़ंक्शन सिंक्रोनाइज़्ड ब्लॉक्स को सीरियलाइज़ करने से बचाएगा।
expects - यह उन शर्तों को निर्दिष्ट करता है जो फ़ंक्शन के आर्गुमेंट्स के लिए आवश्यक हैं ताकि फ़ंक्शन निष्पादित हो सके।
सिंटैक्स
[[expects : condition]]
condition एक शर्त को परिभाषित करता है जो फ़ंक्शन के निष्पादित होने के लिए पूरी होनी चाहिए।
ये C++ 11 से C++ 20 तक C++ में परिभाषित सभी एट्रिब्यूट्स थे। अब, आइए देखें कि प्रोग्रामिंग में इन एट्रिब्यूट्स का उपयोग क्यों किया जाता है यानी प्रस्तावित एट्रिब्यूट्स क्या हल करते हैं?
कोड में बाधाएं जोड़ना - कई मामलों में, एट्रिब्यूट्स कोड में अर्थ जोड़ते हैं और इसे अधिक वैध बनाते हैं और अतिरिक्त प्रयास को कम करते हैं।
कंपाइलर को अधिक ऑप्टिमाइज़ेशन जानकारी प्रदान करना - फॉलथ्रू, लाइकली, maybe_used जैसे कुछ एट्रिब्यूट्स कंपाइलर को विशिष्ट ऑप्टिमाइज़ेशन करने के लिए जानकारी प्रदान करते हैं।
चेतावनियों और त्रुटियों से बचना - कभी-कभी प्रोग्रामर का तर्क C++ के सख्त नियमों के विरुद्ध जाता है। यह वह मामला है जहां कुछ एट्रिब्यूट्स काम आते हैं और उपयोगकर्ताओं को होने वाली चेतावनियों से बचने या दबाने में मदद करते हैं।