मैं एक स्थिरांक का उपयोग करके एक सरणी की लंबाई को परिभाषित कर सकता हूं, इसलिए int d [b] काम क्यों नहीं करता है?


11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

की परिभाषा f[c]मान्य है।
चर bभी एक स्थिर है int, लेकिन संकलक ने मुझे लाइन के लिए "अभिव्यक्ति का निरंतर मूल्य होना चाहिए" त्रुटि दी int d[b]bऔर के बीच अंतर क्या हैं c?

जवाबों:


16

b और c के बीच अंतर क्या हैं?

c का एक संकलन समय स्थिर आरंभीकरण है, जबकि b नहीं करता है। संकलित समय स्थिरांक के साथ एक स्थिर वस्तु अपने आप में एक संकलन समय स्थिर मान है।

चूँकि मैं एक स्थिरांक का उपयोग करके एक आरी के दसवें हिस्से को परिभाषित कर सकता हूं, इसलिए यह काम क्यों नहीं?

बस कोई भी निरंतर नहीं करेगा। constक्वालीफायर का अर्थ है रनटाइम कॉन्स्टेंस (यानी रनटाइम पर मूल्य निर्धारित किया जा सकता है लेकिन ऑब्जेक्ट के जीवनकाल में नहीं बदलेगा)। केवल संकलन समय निरंतर मान सरणी आकार के रूप में उपयोग किया जा सकता है।


6

आप स्थिरांक को मान प्रदान करने के लिए एक गैर-स्थिर चर का उपयोग कर रहे हैं। इसलिए, उस चर का मान संकलन समय निर्धारित नहीं किया जा सकता है । मुझे पता है कि आप बदल नहीं रहे हैं a, लेकिन कंपाइलर ऐसा नहीं सोचता।


4

कंपाइलर डायग्नोस्टिक को वास्तव में समय मूल्यांकन योग्य स्थिर अभिव्यक्ति होना चाहिए ।

चूँकि जो मूल वस्तु bसौंपी गई है const, bवह नहीं है, एक संकलन समय मूल्यांकन योग्य स्थिर अभिव्यक्ति नहीं है, इसलिए संकलन विफल हो जाएगा क्योंकि चर लंबाई सरणियों मानक C ++ में समर्थित नहीं हैं।


1

"कॉन्स्ट" का अर्थ केवल यह है कि परिवर्तनशील समय में चर नहीं बदलेगा, और इसका अर्थ यह नहीं है कि इसका मूल्य संकलन समय पर घटाया जा सकता है।

मुझे लगता है कि आप जो देख रहे हैं वह "बाधा" है। शायद आप इसे इस तरह आज़मा सकते हैं:

constexpr int b = 4; // can't be assigned from a!
int d[b];

इसके बजाय "कॉन्स्ट्रेप" का अर्थ है "वास्तविक कास्ट" और "कॉन्स्ट" का अर्थ केवल "नॉन-चेंजिंग वर्जन" है, क्योंकि कुछ ऐतिहासिक कारण हैं। यह ध्यान रखना चाहिए कि c ++ में एक देशी सरणी हमेशा निश्चित-लंबाई वाली होती है जैसा @Bathsheba ने कहा।


आप किन "अन्य भाषाओं" की बात कर रहे हैं?
ब्रायन

1
@ ब्रायन क्षमा करें, यह प्रासंगिक नहीं है। मैंने अपना जवाब बदल दिया।
लियोन

"कोई सच्चा खिलाड़ी नहीं ..." - मुझे आपके "कॉन्स्ट्रेप" से असहमत होने दें, इसका अर्थ है "वास्तविक कास्ट" और "कॉन्स्ट" का अर्थ केवल "नॉन-चेंजिंग वर्जन" स्टेटमेंट है। "const" का अर्थ है "const", "constexpr" का अर्थ है "constexpr" - उनके पास c ++ भाषा के संदर्भ में दो अलग-अलग अर्थ और निहितार्थ हैं। "कॉन्स्ट" का अर्थ है "ऑब्जेक्ट को संशोधित नहीं किया जा सकता है" , "कॉन्स्टेक्सप्र" का अर्थ है "संकलन समय पर फ़ंक्शन या चर के मूल्य का मूल्यांकन करना संभव है"
शारोन एक्स

क्षमा करें, शायद मैंने इसे गलत तरीके से व्यक्त किया। अंग्रेजी मेरी मातृभाषा नहीं है।
लियोन

1

"स्थिर" शब्द वास्तव में अस्पष्ट है, और कीवर्ड constभ्रामक है।

constका अर्थ है: "अनुमति देने के बाद इस वस्तु के मूल्य को बदल नहीं दिया जाएगा"। यह करता है नहीं मतलब है "संकलन समय निरंतर"। इसका प्रारंभिक मूल्य (और आमतौर पर करता है) अभी भी रनटाइम स्रोतों से आता है।

आप एक सरणी बाध्य के लिए एक संकलन-समय स्थिर की जरूरत है।

कभी-कभी यह संभव है कि किसी वस्तु का नाम fooऐसा हो जो संकलन-समय स्थिर हो, यदि यह है const और इसे एक स्थिर अभिव्यक्ति से शुरू किया गया है, जैसे कि शाब्दिक या कोई constexprचीज। यह मामला है c; यह मामला नहीं है b

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.