2011-08-30 16 views
6

निम्नलिखित पहचानकर्ता कोई संबंध है: एक पहचानकर्ता एक वस्तु या एक समारोह के अलावा और कुछ घोषित किया; एक पहचानकर्ता एक समारोह पैरामीटर घोषित किया गया; स्टोरेज-क्लास विनिर्देशक बाहरी के बिना घोषित ऑब्जेक्ट के लिए एक ब्लॉक स्कोप पहचानकर्ता।ब्लॉक गुंजाइश लिंकेज सी मानक

{ 
    static int a; //no linkage 
} 

एक पहचानकर्ता एक गुंजाइश है, जिसमें कि पहचानकर्ता के पूर्व घोषणा दिखाई दे रहा है, पूर्व घोषणा आंतरिक या बाह्य संबंध, पर पहचानकर्ता के संबंध को निर्दिष्ट करती है में भंडारण-वर्ग विनिर्देशक निर्वासन के साथ घोषित लिए बाद की घोषणा पूर्व घोषणा पर निर्दिष्ट लिंक के समान ही है। पूर्व घोषणा नहीं लिंकेज, तो पहचानकर्ता बाहरी लिंकेज है निर्दिष्ट करता है यदि कोई पूर्व घोषणा दिखाई, या है।

{ 
    static int a; //no linkage 
    extern int a; //a should get external linkage, no? 
} 

जीसीसी त्रुटि: एक के निर्वासन घोषणा नहीं लिंकेज के साथ घोषणा इस प्रकार

किसी ने मुझसे कारण है कि मैं इस त्रुटि मिलता है व्याख्या कर सकते हैं?

धन्यवाद

+1

अर्थ विज्ञान हो सकता है, "कोई संबंध निर्दिष्ट करता है" बनाम "निर्दिष्ट 'नहीं लिंकेज'"। इस मामले में स्वचालित पदोन्नति पागल लगता है। –

+0

मुझे अंतर समझ में नहीं आता है। क्या आप विस्तारित कर सकते हैं? – mindless

उत्तर

8

आपका अनुमान सही है: a की दूसरी घोषणा बाहरी संबंध है।

3 If an identifier has no linkage, there shall be no more than one declaration of the identifier (in a declarator or type specifier) with the same scope and in the same name space, except for tags as specified in 6.7.2.3.

यही है, एक बार आप a घोषित किया है कोई संबंध है करने के लिए, आप एक ही दायरे में इसे फिर से redeclare नहीं कर सकते हैं: हालांकि, अगर आप एक त्रुटि क्योंकि आपके कोड §6.7 में एक बाधा का उल्लंघन करता हो।


इस नियम का मान्य उदाहरण लागू किया जा रहा है:

int a = 10; /* External linkage */ 

void foo(void) 
{ 
    int a = 5; /* No linkage */ 

    printf("%d\n", a); /* Prints 5 */ 

    { 
     extern int a; /* External linkage */ 

     printf("%d\n", a); /* Prints 10 */ 
    } 
} 
+1

क्या आप मुझे एक वैध उदाहरण दे सकते हैं: यदि पूर्व घोषणा कोई संबंध निर्दिष्ट नहीं करती है, तो पहचानकर्ता के पास बाहरी संबंध होता है। मैं किसी के बारे में नहीं सोच सकता। – mindless

+0

@indless: मैंने अपने जवाब में एक उदाहरण जोड़ा है। – caf

2

if the prior declaration specifies no linkage

मतलब है

if the prior declaration specifies not a sign of linkage

और नहीं

if the prior declaration specifies that it has no linkage

यह भ्रामक और अस्पष्ट है; एक मानक लिखने के लिए नहीं हमेशा की तरह ...

+0

आप स्थैतिक को हटा सकते हैं, त्रुटि अभी भी वहां होगी। ब्लॉक स्कोप में स्टेटिक लिंकेज नहीं बदलता है, केवल भंडारण अवधि। फ़ाइल दायरे में यह लिंकेज बदलता है, लेकिन भंडारण अवधि (हमेशा स्थैतिक) नहीं। सी में एक और अस्पष्टता। – mindless

+0

आप गलत हैं; जिसका इरादा आखिरी है, जैसा कि लिखा गया है। इस सवाल पर कोई असर नहीं है, वैसे भी। – caf