2012-07-08 21 views
8

मैं एक हेडर फाइल में निम्नलिखित घोषणा की है:आगे की घोषणा साइड इफेक्ट के साथ टाइपपीफ?

struct my_struct; 
int func(struct my_struct* s);  // Passing struct my_struct* 

आगे घोषणा के बिना, संकलक जाहिर this error देना होगा:

error: 'struct my_struct' declared inside parameter list

हालांकि, अगर मैं की जगह एक टाइपपीफ के साथ my_struct की आगे की घोषणा, और तदनुसार फ़ंक्शन घोषणा अपडेट करें, यह compiles fine:

typedef struct my_struct my_struct_t; 
int func(mystruct_t* s);    // Passing my_struct_t* 

मजे की बात है, अगर मैं typedef रखने के लिए, लेकिन मूल घोषणा my_struct उपयोग करें, यह also compiles:

typedef struct my_struct my_struct_t; 
int func(struct my_struct* s);  // Passing struct my_struct* 

किसी नोटिस किया है कि? क्या यह व्यवहार एक दुष्प्रभाव है?

+2

टाइपपीफ आगे की घोषणा के रूप में भी कार्य करता है, यह टाइप नाम को दायरे में लाता है। –

+0

@DanielFischer हां, मैंने देखा है :) :) लेकिन मुझे मानक बताते हुए कुछ भी नहीं मिला। क्या मैं कुछ भुल गया? –

+0

संरचना में सूचक बनाने के लिए आगे की घोषणा की कोई आवश्यकता नहीं है। यह सिर्फ एक सम्मेलन है। क्या मै गलत हु? –

उत्तर

7

खंड 6.2.1, पैरा 7:

संरचना, संघ, और गणन टैग कि सिर्फ एक प्रकार विशिष्ट एर कि टैग वाणी में टैग की उपस्थिति के बाद शुरू होता गुंजाइश है। प्रत्येक गणना निरंतरता का दायरा है कि एक गणक सूची में अपने डीफिंग एन्यूमेरेटर की उपस्थिति के ठीक बाद शुरू होता है। कोई भी अन्य पहचान का दायरा है जो इसके घोषणाकर्ता के पूरा होने के ठीक बाद शुरू होता है।

और 6.7.2.3 में, पैरा 8:

प्रपत्र का एक प्रकार विशिष्ट एर struct या संघ पहचान फाई एर ऊपर रूपों में से एक है, और के हिस्से के रूप के अलावा अन्य होता है कोई टैग के रूप में पहचान की अन्य घोषणा दिखाई दे रही है, फिर यह एक अपूर्ण संरचना या यूनियन प्रकार की घोषणा करता है, और उस प्रकार के टैग के रूप में पहचान की घोषणा करता है।

typedef इस प्रकार एक अपूर्ण संरचना प्रकार घोषित करता है।

+0

+1 सुंदर! आपका बहुत बहुत धन्यवाद! –