在c标准库中定义了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组件的各个部分进行追逐。
我相信它是在stdio.c
中定义的,它在libc
编译(在基于gnu的系统上)
定义将取决于实现,您将找到它。 对我来说,在OSX 10.6上,它在stdio.h中定义为FILE(结构)。
stdin的类型为_IO_FILE,这是一个在某处明确定义的结构,可能在stdio.h中。 如果没有,请检查stdio.h中包含的头文件以获取_IO_FILE的定义。
在标准库代码中,还有哪些地方? 在这里的Linux机器中,它位于libc.a:stdio.o
,使用nm -o /usr/lib/libc.a | grep stdin | grep D
找到 nm -o /usr/lib/libc.a | grep stdin | grep D
nm -o /usr/lib/libc.a | grep stdin | grep D
如果您想阅读一些代码,请参阅GNU C库 。
C标准明确声明stdin
是stdio.h
定义的宏。 不允许在其他任何地方定义它。
C11 7.21.1
“标题
定义了几个宏,……”/ – /
“宏是……”/ – /
标准错误
标准输入
标准输出它是“指向FILE的指针”类型的表达式,它们分别指向与标准错误,输入和输出流相关联的FILE对象。
这个宏当然可以指向其他地方实现的实现细节,例如“stdio.c”或编译器库选择放置它的任何内容。