c++ जादू की संख्या को मारना: "कॉन्स्टेंट इंट" बनाम "कॉन्स्टैक्स इंट"(या अंत में कोई अंतर नहीं है)




const constexpr (2)

क्या इस मामले में दोनों के बीच कोई सार्थक अंतर है (मुझे यह याद रखना अनिवार्य है कि - या तो मामले में - मूल्य नहीं बदलता है और वास्तव में परिणामी लूप / अनियंत्रित लूप / जो भी कोड में 42 को हार्डकोड करता है) या क्या यह नीचे आता है व्यक्तिगत पसंद?

आपके द्वारा दिखाए गए मामले में कोडजन में कोई अंतर नहीं होगा।

हालांकि, अंतर यह है कि एक constexpr चर गारंटी देता है कि मूल्य को संकलन-समय पर जाना जाता है। @ VittorioRomeo का उत्तर देखें।

अगर यह वास्तव में एक संकलन-समय मान है, तो दस्तावेज़ीकरण के उद्देश्यों के लिए: constexpr लिखना भी अच्छा है: जब कोई आपके कोड को पढ़ता है और constexpr देखता है, तो वे स्वचालित रूप से जानते हैं कि यह वास्तव में निश्चित मूल्य है। यह उस मामले में महत्वपूर्ण है जब आरंभीकरण गैर-तुच्छ है (उदाहरण के लिए एक फ़ंक्शन के लिए कॉल)।

आप सी मैक्रोज़ के लिए वास्तविक प्रतिस्थापन के रूप में constexpr चर भी देख सकते हैं constexpr रूप से निहित (जैसे #define FOO 123 )।

अंत में, याद रखें कि constexpr का मतलब है constexpr

संबंधित मुद्दे में: क्या होगा यदि मैजिक नंबर (और इसे बदलने वाली चीज़) को .ccp फ़ाइल के बजाय हेडर फ़ाइल में घोषित किया गया हो - क्या इससे चीजें बदल जाएंगी?

हालाँकि, यदि आप हेडर फ़ाइल में वैश्विक चर घोषित कर रहे हैं, तो आप शायद constexpr शीर्ष पर inline (C ++ 17 में उपलब्ध) का उपयोग करना चाहते हैं, ताकि आपके पास कार्यक्रम में केवल एक ही इकाई हो, जो एक फायदा है ओडीआर मुद्दों से बचने और संभवतः स्मृति और आरंभीकरण समय को बचाने के लिए।

ODR उल्लंघन को रोकने के लिए हेडर में `const` और` constexpr` चर देखना चाहिए `इनलाइन` हो? अधिक जानकारी के लिए।

https://code.i-harness.com

मान लीजिए कि मेरे पास एक magic number मैं छुटकारा चाहता हूं ...

//whatever.cpp

for (int i = 0; i < 42; i++)
{
    //...
}

यथोचित मैं इसे दो तरीकों से मार सकता था:

या तो const int SOMETHING_SOMETHING_MEANING_OF_LIFE = 42
या constexpr int SOMETHING_SOMETHING_MEANING_OF_LIFE = 42
स्रोत में .cpp फ़ाइल।

क्या इस मामले में दोनों के बीच कोई सार्थक अंतर है (मुझे याद है कि कंपाइलर ने कहा कि - या तो मामले में - कि मूल्य नहीं बदलता है और इस प्रकार 42 परिणामी लूप / अनियंत्रित लूप / जो भी मशीन-कोड है) में वास्तव में हार्डकोड किया गया है या क्या यह व्यक्तिगत स्वाद के लिए आता है?

एक संबंधित मुद्दे में: क्या होगा अगर magic number (और इस प्रकार वह चीज जो इसे बदल देती है) को एक हेडर (.cc) फ़ाइल में एक स्रोत ( .ccp ) फ़ाइल के बजाय घोषित किया गया था - क्या इससे चीजें बदल जाएंगी (और यदि हां, तो कैसे) ?


const int का उपयोग केवल एक स्थिर अभिव्यक्ति के हिस्से के रूप में किया जा सकता है यदि इसे एक से आरंभ किया गया था, लेकिन यह आपको गारंटी नहीं देता है कि यह था।

const int i = 42; // OK, usable in a constant expression
int j = 42;
const int k = j;  // OK, not usable in a constant expression

constexpr int गारंटी देता है कि आपके वैरिएबल के लिए constexpr int एक स्थिर अभिव्यक्ति है , अन्यथा आपका प्रोग्राम संकलित नहीं होगा।

constexpr int i = 42; // OK, usable in a constant expression
int j = 42;
constexpr int k = j;  // Compile-time error, 'j' is not a constant expression

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





magic-numbers