2011-08-02 14 views
7

मैं stdio.h में इस लाइन पाया:सी मानक पुस्तकालय में परिभाषित stdin कहां है?

extern struct _IO_FILE *stdin; 

इस 'निर्वासन' कीवर्ड के आधार पर, मैं यह मान सिर्फ एक घोषणा है। मुझे आश्चर्य है कि stdin कहाँ परिभाषित और प्रारंभ किया गया है?

उत्तर

8

यह आपके सी पुस्तकालय के स्रोत कोड में परिभाषित किया गया है। आपको आमतौर पर केवल संकलन के लिए हेडर की आवश्यकता होती है, लेकिन आप कई ओपन-सोर्स मानक पुस्तकालयों (जैसे ग्लिबैक) के लिए स्रोत कोड पा सकते हैं।

glibc में, यह इस तरह के रूप में libio/stdio.c में परिभाषित किया गया है:

_IO_FILE *stdin = (FILE *) &_IO_2_1_stdin_; 

कौन सा है बदले में इस तरह libio/stdfiles.c में मैक्रो का उपयोग परिभाषित:

DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES); 

DEF_STDFILE मैक्रो की परिभाषा निर्भर करता है कुछ चीजों पर, लेकिन फ़ाइल डिस्क्रिप्टर 0 (जो यूनिक्स पर मानक इनपुट है) का उपयोग कर उपयुक्त FILE संरचना को कम या कम सेट करता है।

परिभाषा (और निश्चित रूप से) आपकी सी लाइब्रेरी के आधार पर और निश्चित रूप से प्लेटफार्म के आधार पर भिन्न हो सकती है। यदि आप चाहते हैं, तो आप अपने मानक पुस्तकालय के I/O घटक के विभिन्न हिस्सों के आस-पास हंस का पीछा जारी रख सकते हैं।

0

मानक लाइब्रेरी कोड में, और कहां? यहां लिनक्स मशीन में यह libc.a:stdio.o में है, nm -o /usr/lib/libc.a | grep stdin | grep D का उपयोग करके पाया गया। अगर आप कुछ कोड पढ़ना चाहते हैं, तो GNU C Library देखें।

0

मेरा मानना ​​है कि यह stdio.c जो (जीएनयू आधारित सिस्टम पर) libc में में संकलित किया गया है

+2

यह डाउनवॉटेड क्यों है? – Alan

0

परिभाषा में परिभाषित किया गया है कार्यान्वयन निर्भर हो जाएगा, इच्छा, जहां आप इसे खोजने के रूप में। मेरे लिए, ओएसएक्स 10.6 पर, यह एक फ़ाइल (एक संरचना) के रूप में stdio.h में परिभाषित किया गया है।

stdin प्रकार _IO_FILE प्रकार है, एक संरचना जिसे स्पष्ट रूप से कहीं भी परिभाषित किया गया है, शायद stdio.h में। यदि नहीं, _IO_FILE की परिभाषा के लिए stdio.h में शामिल हेडर फ़ाइलों में जांचें।

+2

नहीं, यह * घोषणा * है। * परिभाषा * सी पुस्तकालय स्रोत कोड में है। –

+0

मैं पालन नहीं करता हूं। मुझे लगता है कि फ़ाइल को मेरे सिस्टम पर stdio.h की लाइनों 132-163 पर परिभाषित किया गया है, जहां इसके सभी सदस्यों को निर्दिष्ट किया गया है। क्या यह संरचना के लिए परिभाषा का गठन नहीं करता है? – bcr

+1

@bcr: यह संरचना * प्रकार * को परिभाषित करता है। यह * ऑब्जेक्ट * 'stdin' को परिभाषित नहीं करता है। –

0

सी मानक स्पष्ट रूप से बताता है कि stdinstdio.h में परिभाषित एक मैक्रो है। इसे कहीं और परिभाषित करने की अनुमति नहीं है।

C11 7.21.1

"शीर्षक <stdio.h> कई मैक्रो को परिभाषित करता है, ..."/-/

"मैक्रो नहीं है ..."/-/

stderr
stdin
stdout

जो कि 'सूचक के लिए सूचक' प्रकार के अभिव्यक्ति हैं, जो मानक त्रुटि, इनपुट और आउटपुट स्ट्रीम के साथ क्रमशः FILE ऑब्जेक्ट्स से संबंधित हैं।

यह मैक्रो निश्चित रूप से कार्यान्वित विवरणों पर इंगित कर सकता है जो "stdio.c" या जो भी कंपाइलर लाइब्रेरी ने इसे रखना चुना है, लागू किया है।

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

  • कोई संबंधित समस्या नहीं^_^