【发布时间】:2011-08-02 01:06:32
【问题描述】:
我在 stdio.h 中找到了这一行:
extern struct _IO_FILE *stdin;
基于这个'extern'关键字,我认为这只是一个声明。我想知道标准输入在哪里定义和初始化?
【问题讨论】:
标签: c declaration stdin definition standard-library
我在 stdio.h 中找到了这一行:
extern struct _IO_FILE *stdin;
基于这个'extern'关键字,我认为这只是一个声明。我想知道标准输入在哪里定义和初始化?
【问题讨论】:
标签: c declaration stdin definition standard-library
它在 C 库的源代码中定义。您通常只需要编译头文件,但您可以找到许多开源标准库(如 glibc)的源代码。
在 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(这是 Unix 上的标准输入)设置了一个适当的 FILE 结构。
定义可能(当然也会)因您的 C 库而异,当然也因平台而异。如果您愿意,您可以继续围绕标准库的 I/O 组件的各个部分进行追逐。
【讨论】:
我相信它是在 stdio.c 中定义的,它被编译到 libc 中(在基于 gnu 的系统上)
【讨论】:
定义将取决于实现,您可以在哪里找到它。对我来说,在 OSX 10.6 上,它在 stdio.h 中定义为 FILE(结构)。
stdin 是 _IO_FILE 类型的,这是一个在某处明确定义的结构,可能在 stdio.h 中。如果没有,请检查包含在 stdio.h 中的头文件以获取 _IO_FILE 的定义。
【讨论】:
stdin.
在标准库代码中,还有哪里?在附近的 Linux 机器中,它位于 libc.a:stdio.o,使用 nm -o /usr/lib/libc.a | grep stdin | grep D 找到。如果您想阅读一些代码,请参阅GNU C Library。
【讨论】:
C 标准明确指出stdin 是在stdio.h 中定义的宏。不允许在其他任何地方定义。
C11 7.21.1
"标题
<stdio.h>定义了几个宏,..." /--/"宏是..." /--/
stderr
stdin
stdout它们是指向 FILE 对象的“指向文件的指针”类型的表达式 分别与标准错误、输入和输出流相关联。
这个宏当然可以指向在其他地方实现的实现细节,例如在“stdio.c”或任何编译器库选择放置它的地方。
【讨论】: