2012-11-01 15 views
30

संभव डुप्लिकेट:
Const vs Static Constस्थिर स्थिरांक और कॉन्स के बीच क्या अंतर है?

static const और const के बीच क्या अंतर है? उदाहरण के लिए:

static const int a=5; 
const int i=5; 

उन दोनों के बीच कोई अंतर है? आप एक दूसरे के ऊपर कब उपयोग करेंगे?

+0

@EtiennedeMartel "स्थैतिक डिफ़ॉल्ट व्यवहार है" निश्चित रूप से नहीं। आपको यह विचार किसने दिया? –

+2

संबंधित: http://stackoverflow.com/questions/6381088/const-vs-static-const – halex

+2

फिर से खोलने के लिए वोट दिया गया। "डुप्लिकेट" एक पूरी तरह से अलग सवाल पूछ रहा है, स्मृति उपयोग के लिए विशिष्ट। यह सवाल अंतर के बारे में एक और सामान्य सवाल पूछता है। – rmaddy

उत्तर

25

अंतर जुड़ाव है।

// At file scope 
static const int a=5; // internal linkage 
const int i=5;   // external linkage 

i वस्तु अनुवाद इकाई जहां यह परिभाषित किया गया है बाहर नहीं किया जाता है, तो आप static विनिर्देशक के साथ यह घोषणा करनी चाहिए।

यह संकलक को (संभावित रूप से) और अनुकूलन करने में सक्षम बनाता है और पाठक को सूचित करता है कि ऑब्जेक्ट का उपयोग अपनी अनुवाद इकाई के बाहर नहीं किया जाता है।

+3

+1 यह बहुत अच्छा होगा अगर आप यह भी जोड़ सकते हैं कि इसका अर्थ क्या है यदि ये घोषणाएं फ़ंक्शन के भीतर हैं। – Praetorian

+0

क्या आप सुनिश्चित हैं कि 'const int i = 5;' बाहरी संबंध है ?? सी ++ में यह नहीं है ... –

+4

@KerrekSB फ़ाइल-स्कोप पर, हां। * (सी 99, 6.2.2 पी 5) "यदि किसी ऑब्जेक्ट के लिए पहचानकर्ता की घोषणा फ़ाइल स्कोप है और कोई स्टोरेज-क्लास विनिर्देशक नहीं है, तो इसका लिंक बाहरी है।" * – ouah

40

स्थैतिक एक समारोह के बाहर दृश्यता या एक चर के अंदर दृश्यता निर्धारित करता है। तो इसके पास कॉन्स प्रति से कोई लेना देना नहीं है।

कॉन्स का अर्थ है कि आप इसे शुरू करने के बाद मूल्य बदल नहीं रहे हैं।

फ़ंक्शन के अंदर स्थिर का अर्थ है कि फ़ंक्शन समाप्त होने से पहले और बाद में चर मौजूद होगा।

फ़ंक्शन के बाहर स्थैतिक अर्थ यह है कि स्थिर चिह्नित प्रतीक का दायरा उस .c फ़ाइल तक सीमित है और इसके बाहर नहीं देखा जा सकता है।

तकनीकी रूप से (यदि आप इसे देखना चाहते हैं), स्थिर एक भंडारण विनिर्देशक है और कॉन्स्ट एक प्रकार क्वालीफायर है।

+0

सरल स्पष्टीकरण धन्यवाद! – Alec

0

यह इस बात पर निर्भर करता है कि ये परिभाषाएं फ़ंक्शन के अंदर हैं या नहीं। के बाहर के मामले का उत्तर ओहह द्वारा ऊपर दिया गया है। एक समारोह के अंदर प्रभाव अलग है, नीचे दिए गए उदाहरण के रूप में रेखांकित:

#include <stdlib.h> 

void my_function() { 
    const int foo = rand();   // Perfectly OK! 
    static const int bar = rand(); // Compile time error. 
} 

आप एक स्थानीय चर होना चाहते हैं "वास्तव में निरंतर," आप इसे न सिर्फ "स्थिरांक" लेकिन "स्थिर परिभाषित करने के लिए है स्थिरांक "।

+0

यह पूरी तरह से मेरे लिए संकलित करता है ... लेकिन मुझे पता है कि इस मामले में स्थिर स्थिर चर होने के लिए यह बेवकूफ है। – DrumM

संबंधित मुद्दे