在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标准明确声明stdinstdio.h定义的宏。 不允许在其他任何地方定义它。

C11 7.21.1

“标题定义了几个宏,……”/ – /

“宏是……”/ – /

标准错误
标准输入
标准输出

它是“指向FILE的指针”类型的表达式,它们分别指向与标准错误,输入和输出流相关联的FILE对象。

这个宏当然可以指向其他地方实现的实现细节,例如“stdio.c”或编译器库选择放置它的任何内容。