2009-12-22 4 views
6

मैंने एक बहुत ही उत्सुक व्यवहार देखा कि, यदि मानक है, तो मुझे शोषण करने में बहुत खुशी होगी (मैं इसके साथ क्या करना चाहता हूं, इस सवाल के बारे में समझाने और अप्रासंगिक है)।फ़ंक्शन स्थिर और बाद में गैर स्थैतिक घोषित करना: क्या यह मानक है?

व्यवहार है:

void name(); 
static void name() { 
    /* Illegal */ 
} 

तो, यह मानक है और मैं उसी तरह व्यवहार करने के लिए अन्य compilers उम्मीद कर सकते हैं:

static void name(); 
void name() { 
    /* This function is now static, even if in the declaration 
    * there is no static keyword. Tested on GCC and VS. */ 
} 

क्या उत्सुक है कि उलटा एक संकलन समय त्रुटि का उत्पादन होता है ? धन्यवाद!

उत्तर

12

सी ++ मानक:

7.1.1/6: "A name declared in a namespace scope without a storage-class-specifier has external linkage unless it has internal linkage because of a previous declaration" [or unless it's const].

अपने पहले मामले में, name एक namespace गुंजाइश (विशेष रूप से, वैश्विक नामस्थान) में घोषित किया जाता है। इसलिए पहली घोषणा दूसरी घोषणा के संबंध को बदल देती है।

उलटा प्रतिबंध लगा दिया है क्योंकि:

7.1.1/7: "The linkages implied by successive declarations for a given entity shall agree".

तो, अपने दूसरे उदाहरण में, पहली घोषणा बाहरी संबंध है, और दूसरा (7.1.1/6 से) आंतरिक लिंकेज (स्पष्ट रूप से), और ये सहमत नहीं हैं।

आप सी के बारे में भी पूछते हैं, और मुझे लगता है कि यह वही चीज है। लेकिन मेरे पास सी ++ पुस्तक है, जबकि आप एक ड्राफ्ट सी मानक ऑनलाइन देखने में सक्षम हैं ;-)

+0

मैं सी ++ का उपयोग कर रहा हूं, लेकिन मैंने एक सी टैग जोड़ा क्योंकि मुझे लगा कि यह सी –

+0

ओह में समान होगा और महान उत्तर के लिए धन्यवाद –

3

क्वालीफायर जो आपने फ़ंक्शन प्रोटोटाइप (या जो अंतर्निहित हैं) पर रखे हैं स्वचालित रूप से उपयोग किए जाते हैं जब समारोह घोषित किया जाता है।

तो अपने दूसरे मामले में प्रोटोटाइप पर static की कमी का मतलब है कि समारोह नहीं स्थिर के रूप में परिभाषित किया गया था, और फिर जब बाद में स्थिर के रूप में घोषित किया गया था, यह एक त्रुटि थी।

यदि आप प्रोटोटाइप में रिटर्न प्रकार को छोड़ना चाहते हैं, तो डिफ़ॉल्ट int होगा और फिर आपको void रिटर्न प्रकार के साथ एक त्रुटि फिर से मिल जाएगी। __crtapi और __stdcall और __declspec() (माइक्रोसॉफ्ट सी कंपाइलर में) के साथ एक ही बात होती है।

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