我在 stdio.h 中找到了这一行:
extern struct _IO_FILE *stdin;
基于使用了'extern'关键字,我认为这只是一个声明。我想知道stdin在哪里被定义和初始化?
我在 stdio.h 中找到了这一行:
extern struct _IO_FILE *stdin;
基于使用了'extern'关键字,我认为这只是一个声明。我想知道stdin在哪里被定义和初始化?
它是在你的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 组件的各个部分。
stdin
是在stdio.h
中定义的宏,不允许在其他地方定义。这个宏是C11 7.21.1中定义的,<stdio.h>
头文件定义了几个宏,它们是指向与标准错误、输入和输出流相关联的FILE对象的指针表达式,分别是stderr、stdin和stdout。当然,这个宏可以指向实现细节,比如在"stdio.c"或编译器库选择放置的任何其他地方实现。libc.a:stdio.o
中,可以使用 nm -o /usr/lib/libc.a | grep stdin | grep D
找到。如果你想阅读一些代码,请参阅 GNU C Library。我相信它被定义在 stdio.c
中,这个文件会被编译进 libc
中(在基于 GNU 的系统上)。
定义将取决于实现,您可以在哪里找到它也是如此。对我来说,在OSX 10.6上,它在stdio.h中定义为FILE(一个结构体)。
stdin的类型是_IO_FILE,这是一个明确定义在某个地方的结构体,可能在stdio.h中。如果没有,请检查stdio.h中包含的头文件以获取_IO_FILE的定义。
stdin
。 - Keith Thompson