2012-01-26 6 views
5

के रूप में घोषित किया गया है, आज मैं कुछ कोड में आया जो मुझे आश्चर्यचकित कर दिया। एक चर को स्थिर होने के रूप में .c फ़ाइल में (फ़ंक्शन के बाहर) परिभाषित किया गया था। हालांकि, .h फ़ाइल में इसे बाहरी होने के रूप में घोषित किया गया था।वैरिएबल के रूप में परिभाषित चर के रूप में कोई चेतावनी या त्रुटि संकेत नहीं है लेकिन बाहरी

संरचना परिभाषा और घोषणा ज में:

typedef struct 
{ 
    unsigned char counter; 
    unsigned char some_num; 
} One_Struct; 

typedef struct 
{ 
    unsigned char counter; 
    unsigned char some_num; 
    const unsigned char * p_something; 
} Another_Struct; 

typedef struct 
{ 
    One_Struct * const p_one_struct; 
    Another_Struct * const p_another_struct; 
} One_Useful_Struct; 

extern One_Useful_Struct * const p_my_useful_struct[]; 

परिभाषा और आरंभीकरण ग में:

static One_Useful_Struct * const p_my_useful_struct[MAX_USEFUL_STRUCTS] = 
{ 
    &p_my_useful_struct_regarding_x, 
    &p_my_useful_struct_regarding_y, 
}; 

प्रश्न: यहाँ कोड की एक ऐसी ही उदाहरण है तो मेरा सवाल है, मुझे एक कंपाइलर त्रुटि या चेतावनी क्यों नहीं मिली?

कोड कुछ समय से अन्य परियोजनाओं में सफलतापूर्वक चल रहा है। मैंने ध्यान दिया कि पॉइंटर का उपयोग कभी भी .c फ़ाइल के बाहर नहीं किया जाता है जिसमें इसे परिभाषित किया जाता है और स्थिर रूप से परिभाषित किया गया था (मैंने बाहरी घोषणा को हटा दिया)। एकमात्र कारण जिसे मैंने पाया था क्योंकि मैं इस परियोजना पर लिंट चला गया था और लिंट ने इसे उठाया था।

उत्तर

6

यह certianly नहीं है मानक सी जीसीसी और बजना दोनों का पता लगाने और इस मामले पर एक त्रुटि दे:

$ gcc example.c 
example.c:4: error: static declaration of ‘x’ follows non-static declaration 
example.c:3: error: previous declaration of ‘x’ was here 
$ clang example.c 
example.c:4:12: error: static declaration of 'x' follows non-static declaration 
static int x; 
     ^
example.c:3:12: note: previous definition is here 
extern int x; 
     ^
1 error generated. 

आप एक बहुत अनुमोदक संकलक का उपयोग करना चाहिए - हो सकता है दृश्य स्टूडियो? मैंने अभी अपनी विंडोज मशीन पर जांच की है और वीएस2003 चुपचाप मेरे उदाहरण प्रोग्राम स्वीकार करता है। आप जो कुछ भी संकलक का ही विस्तार उपयोग कर रहे हैं यह है कि आप का उपयोग कर रहे है

> cl /nologo /Wall example.c 
example.c 
example.c(4) : warning C4211: nonstandard extension used : redefined extern to static 

मेरे लिए लग रहा है: /Wall जोड़ा जा रहा है एक चेतावनी देता है।

+0

यह एक अच्छा मुद्दा है, मुझे यह देखना होगा कि कौन से एक्सटेंशन मौजूद हैं। मैं एआरएम के लिए केइल यूविजन का उपयोग कर रहा हूं। –

+0

जगह में कोई अजीब एक्सटेंशन नहीं हैं। यह सिर्फ इस कंपाइलर के साथ कुछ होना चाहिए। आपके इनपुट के लिए धन्यवाद, मैं इसकी सराहना करता हूं। –

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