C标准库中stdin在哪里定义?

11

我在 stdio.h 中找到了这一行:

extern struct _IO_FILE *stdin;

基于使用了'extern'关键字,我认为这只是一个声明。我想知道stdin在哪里被定义和初始化?

5个回答

12

它是在你的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 组件的各个部分。


2
C标准明确规定stdin是在stdio.h中定义的宏,不允许在其他地方定义。这个宏是C11 7.21.1中定义的,<stdio.h>头文件定义了几个宏,它们是指向与标准错误、输入和输出流相关联的FILE对象的指针表达式,分别是stderrstdinstdout。当然,这个宏可以指向实现细节,比如在"stdio.c"或编译器库选择放置的任何其他地方实现。

0
在标准库代码中,还有哪里可以找到呢?在这台 Linux 机器上,它在 libc.a:stdio.o 中,可以使用 nm -o /usr/lib/libc.a | grep stdin | grep D 找到。如果你想阅读一些代码,请参阅 GNU C Library

0

我相信它被定义在 stdio.c 中,这个文件会被编译进 libc 中(在基于 GNU 的系统上)。


0

定义将取决于实现,您可以在哪里找到它也是如此。对我来说,在OSX 10.6上,它在stdio.h中定义为FILE(一个结构体)。

stdin的类型是_IO_FILE,这是一个明确定义在某个地方的结构体,可能在stdio.h中。如果没有,请检查stdio.h中包含的头文件以获取_IO_FILE的定义。


2
不,那是声明定义在C库源代码中。 - Adam Rosenfield
我不明白。在我的系统上,似乎FILE在stdio.h的132-163行被定义,并且其中指定了所有成员。这难道不构成结构体的定义吗? - bcr
1
@bcr: 它定义了结构体 type。它并没有定义对象 stdin - Keith Thompson
抱歉,我以为Adam指的是我的第二个“定义”...对不起。 - bcr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接