2010-04-06 9 views
8

मुझे सी भाषा में टाइप किए गए कीवर्ड के साथ कोई समस्या है।सी भाषा में टाइपपीफ का व्याकरण और वाक्यविन्यास

मेरा कार्यक्रम में, मैं निम्नलिखित कोड का उपयोग करें:

typedef int* a[10]; 

int main(){ 
int a[10]; 
} 

वे अच्छी तरह से काम करते हैं। लेकिन एक चर के बीच कोई संघर्ष क्यों नहीं है और एक ही नाम साझा करने वाला एक प्रकार है?

सम्मान।

+0

कूल सवाल - मैंने कभी इसे वास्तव में नहीं माना है। जिस प्रकार आप परिभाषित करते हैं वह अजीब अजीब है, मुझे उम्मीद है कि यह केवल प्रदर्शन उद्देश्यों के लिए है :-) –

+0

आप सही हैं, मैं नहीं चाहता कि मेरा कोड पहेली के रूप में पढ़ना मुश्किल हो। :-) –

+0

वाह, जीसीसी भी "ए" के साथ ठीक है (जब तक यह मुख्य में है, वैश्विक नहीं) –

उत्तर

6

msdn C language reference देखें:

नाम typedef साधारण पहचानकर्ता (अधिक जानकारी के लिए Name Spaces देखें) के साथ नाम स्थान को साझा करें। इसलिए, एक प्रोग्राम में एक ही नाम से एक टाइपिफ़ नाम और स्थानीय-स्कोप पहचानकर्ता हो सकता है।

+1

उत्सुक उद्धरण। इसे जल्दी से पढ़ना यह एक ऑक्सीमोरोन की तरह लगता है। यदि वे एक नामस्थान साझा करते हैं, तो उनके पास समान नाम कैसे हो सकता है? क्या यह स्थानीय-स्कोप * की वजह से है? –

+0

हम्म ... "नाम रिक्त स्थान" लिंक जो आप इंगित करते हैं: "टाइपपीफ नामों को समान दायरे में पहचानकर्ता के रूप में उपयोग नहीं किया जा सकता है।" –

+3

@Eli: '{int x; {फ्लोट एक्स;}} ' – sbi

6

सी मानक का कहना है (धारा 6.2.1 - पहचानकर्ता के कार्यक्षेत्र):

एक पहचानकर्ता एक वस्तु को निरूपित कर सकते हैं; फ़ंक्शन; एक टैग या संरचना, संघ, या गणना का सदस्य; टाइपपीफ नाम; एक लेबल नाम; एक मैक्रो नाम; या एक मैक्रो पैरामीटर। पहचानकर्ता प्रोग्राम में विभिन्न बिंदुओं पर विभिन्न इकाइयों को इंगित कर सकता है।

कश्मीर & R2 कहना (A.11.1 - शाब्दिक स्कोप)

पहचानकर्ता कई नाम रिक्त स्थान में गिर जाते हैं कि एक दूसरे के साथ हस्तक्षेप नहीं करते; अलग-अलग नाम रिक्त स्थान में उपयोग किए जाने पर, समान पहचानकर्ता विभिन्न उद्देश्यों के लिए उपयोग किया जा सकता है, यहां तक ​​कि में भी एक ही दायरा हो सकता है। ये कक्षाएं हैं: ऑब्जेक्ट्स, फ़ंक्शंस, टाइपपीफ नाम, और enum स्थिरांक; लेबल; संरचनाओं या संघों के टैग, और गणनाएं; और प्रत्येक संरचना या संघ के व्यक्तिगत रूप से सदस्य।

मुझे यह स्वीकार करना होगा कि यह मुझे भ्रमित करता है। दूसरे उद्धरण को पढ़ना ऐसा लगता है कि परिवर्तनीय नाम और typedef -ed प्रकार संघर्ष होना चाहिए।

+0

लेकिन मैं अभी भी स्पष्ट नहीं हूं कि "ए" अलग-अलग इकाइयों को बताते हुए पूर्ववर्ती कोडों में सह-अस्तित्व में कैसे हो सकता है। क्या आप मुझे और स्पष्टीकरण दे सकते हैं, कृपया? धन्यवाद। –

+1

@Neil: मैंने विराम चिह्न को अलग-अलग पढ़ा। ऐसा लगता है जैसे ऑब्जेक्ट्स, फ़ंक्शंस, टाइपपीफ नाम और एनम स्थिरांक एक वर्ग हैं। अगला (अर्धविराम के बाद) लेबल, अगले टैग, आदि –

3

चर और typedefs ही नाम स्थान पर कब्जा है, और कर सकते हैं नहीं बिल्कुल एक ही दायरे में अन्य पहचानकर्ता के साथ साझा नाम।

हालांकि आपका दूसरा amain के अंदर है, और दायरे के नियम लागू होते हैं: दूसरा a पहले ओवरराइड करता है।

तुम सिर्फ सादा चर के साथ एक ही बात कर सकते हैं:

int a; 

int main() { 
    int a; 
} 

आप देखेंगे कि यदि आप मुख्य बाहर चर घोषणा ले जाते हैं, कार्यक्रम संकलन नहीं होंगे।

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