2012-09-16 13 views
10

मैं निम्नलिखित कोड सी में एक बहुत का उपयोग करें:typedef struct पर स्थिर का उपयोग

typedef struct 
    { 
    int member; 
    } structname; 

अब मैं कि struct परिभाषा किसी विशेष स्रोत फ़ाइल के लिए लोकल, ताकि कोई अन्य स्रोत फ़ाइल भी जानता है कोशिश कर रहा हूँ संरचना मौजूद है। मैंने निम्नलिखित कोशिश की:

static typedef struct 
    { 
    int member; 
    } structname; 

लेकिन जीसीसी एक अवैध पहुंच विनिर्देशक के कारण whines। क्या एक स्रोत फ़ाइल में एक संरचना की घोषणा निजी रखना संभव है?

+5

यह "चमकदार" नहीं है, दोस्त। यह एक * वाक्यविन्यास त्रुटि * है। – paulsm4

उत्तर

21

यदि आप एक .c फ़ाइल में टाइपपीफ संरचना घोषित करते हैं, तो यह उस स्रोत फ़ाइल के लिए निजी होगा।

यदि आप .h फ़ाइल में इस टाइपिफ़ को घोषित करते हैं, तो यह सभी .c फ़ाइलों के लिए एक्सेसिबल होगा जिसमें यह हेडर फ़ाइल शामिल है।

अपने बयान:

static typedef struct 

स्पष्ट रूप से अवैध जब से तुम न एक चर घोषित करने और न ही एक नए प्रकार को परिभाषित कर रहे हैं।

+0

क्षमा करें, मैंने अपना पूरा कोड दूसरी बार नहीं रखा। इस पोस्ट को – nuju

+5

को ठीक करने के लिए मेरे पोस्ट को संपादित किया गया है यह अभी भी मेरे दोस्त को अवैध है। स्थैतिक का उपयोग केवल एक चर या फ़ंक्शन घोषित करने के लिए किया जा सकता है, न कि किसी नए प्रकार को परिभाषित करने के लिए। स्थिर और टाइपफेफ एक साथ नहीं जाते हैं। –

4

एक संरचना परिभाषा एक स्रोत फ़ाइल के लिए निजी है जब तक कि साझा हेडर फ़ाइल में नहीं रखा जाता है। स्ट्रक्चर के सदस्यों को तब तक कोई अन्य स्रोत फ़ाइल संरचना के सदस्यों तक पहुंच नहीं सकती है, भले ही लेआउट को संरचना में पॉइंटर दिया गया हो (क्योंकि लेआउट अन्य संकलन इकाई में ज्ञात नहीं है)।

यदि संरचना को कहीं और इस्तेमाल करने की आवश्यकता है, तो इसे केवल एक सूचक के रूप में उपयोग किया जाना चाहिए। हेडरफ़ाइल में फॉर्म struct structname; typedef struct structname structname; के आगे की घोषणा करें, और अपने कोडबेस में कहीं और structname * का उपयोग करें। फिर, चूंकि संरचना सदस्य केवल एक स्रोत फ़ाइल में दिखाई देते हैं, इसलिए संरचना की सामग्री प्रभावी रूप से उस फ़ाइल में 'निजी' होती है।

+0

यह मुझे भ्रमित करता है। क्या आप कह रहे हैं कि इसे पॉइंटर के रूप में इस्तेमाल किया जाना चाहिए भले ही यह हेडर फ़ाइल में हो? – Aerovistae

+0

@ एरोविस्टे: यदि यह हैडर फ़ाइल में * है, तो यह निजी नहीं है, और किसी भी फ़ाइल द्वारा पूरी तरह से उपयोग किया जा सकता है जिसमें हेडर फ़ाइल शामिल है। – nneonneo

+0

मैंने इस बारे में एक प्रश्न पोस्ट किया है ताकि आप एक लंबे टिप्पणी विनिमय के साथ फंस न जाएं, अगर आप उत्तर देने में रूचि रखते हैं - http://stackoverflow.com/questions/27933144/how-do-structs-behave-in -मार्म-ऑफ-विज़िबिलिटी-टू-टू-फाइल – Aerovistae

3

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

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

1

हर्नन वेलास्क्यूज़ का उत्तर सही उत्तर है: कई आपके कोड स्निपेट के साथ समस्याएं हैं। यहां एक काउंटर उदाहरण है:

/* This should go in a .h if you will use this typedef in multiple .c files */ 
typedef struct { 
    int a; 
    char b[8]; 
} mystructdef; 

int 
main (int argc, char *argv[]) 
{ 
    /* "static" is legal when you define the variable ... 
    ... but *not* when you declare the typedef */ 
    static mystructdef ms; 
संबंधित मुद्दे