वास्तव में पंडिताऊ नियमों के अनुसार, हाँ, अपने कोड है कि स्थिर पूर्णांक के लिए एक परिभाषा की जरूरत है। लेकिन व्यावहारिक नियमों के अनुसार, और सभी कंपाइलर क्या कार्यान्वित करते हैं क्योंकि इस प्रकार सी ++ 03 के नियम इरादे से हैं - नहीं, आपको परिभाषा की आवश्यकता नहीं है।
ऐसे स्थैतिक निरंतर पूर्णांक के नियम आपको परिभाषा को छोड़ने के लिए अनुमति देते हैं यदि पूर्णांक केवल ऐसी स्थितियों में उपयोग किया जाता है जहां एक मूल्य तुरंत पढ़ा जाता है, और यदि स्थिर सदस्य निरंतर अभिव्यक्तियों में उपयोग किया जा सकता है।
अपनी वापसी बयान में सदस्य के मान तुरंत, पढ़ने के लिए है ताकि आप स्थिर निरंतर पूर्णांक सदस्य की परिभाषा यह है कि अगर इसके बारे में केवल फायदा नहीं है मिटा सकते हैं। निम्नलिखित स्थिति, एक परिभाषा की जरूरत है, लेकिन:
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
int *p = &A::B::b;
}
कोई मूल्य यहाँ पढ़ रहा है - लेकिन बजाय इसके बारे में पता लिया जाता है। इसलिए, सी ++ 03 मानक का इरादा यह है कि आपको कुछ कार्यान्वयन फ़ाइल में निम्न जैसे सदस्य की परिभाषा प्रदान करनी है।
const int A::B::b;
नोट वास्तविक सी ++ 03 स्टैंडर्ड में प्रदर्शित होने के नियमों का कहना है कि कि एक परिभाषा केवल जहां चर प्रयोग किया जाता है जहां एक निरंतर अभिव्यक्ति आवश्यक है आवश्यकता नहीं है। हालांकि, यह नियम सख्ती से लागू होने पर बहुत सख्त है। यह आपको केवल सरणी-आयाम जैसी स्थिति की परिभाषा को छोड़ने की अनुमति देगा - लेकिन वापसी विवरण जैसे मामलों में परिभाषा की आवश्यकता होगी। संबंधित दोष रिपोर्ट here है।
C++ 0x के शब्दों है कि दोष रिपोर्ट संकल्प शामिल करने के लिए, और के रूप में लिखा अपने कोड अनुमति देने के लिए अद्यतन किया गया है।
स्रोत
2009-08-21 14:42:17
कोड _does_ में 'ए' के लिए परिभाषा है। –
नहीं, इसमें कोई परिभाषा नहीं है। –
@ हेंक। ज़रुरी नहीं। एक समारोह में 'ए' या 'बी' के पते को पारित करने का प्रयास करें और देखें कि कंपाइलर कौन सा संदेश उत्पन्न करता है! –