我在stdio.h中找到了这一行:
extern struct _IO_FILE *stdin;
基于这个'extern'关键字,我认为这只是一个声明。我想知道stdin在哪里定义和初始化?
答案 0 :(得分:10)
它在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
宏的定义取决于一些事情,但它或多或少使用文件描述符FILE
(它是标准输入)来设置适当的0
结构。的Unix)。
定义可能(当然也有所不同)取决于您的C库,当然还有平台。如果需要,您可以继续围绕标准库的I / O组件的各个部分进行追逐。
答案 1 :(得分:0)
在标准库代码中,还有哪些地方?在这里的Linux机器中,它位于libc.a:stdio.o
,使用nm -o /usr/lib/libc.a | grep stdin | grep D
找到。如果您想阅读一些代码,请参阅GNU C Library。
答案 2 :(得分:0)
我相信它是在stdio.c
中定义的,它在libc
中编译(在基于gnu的系统上)
答案 3 :(得分:0)
定义将依赖于实现,您将找到它。对我来说,在OSX 10.6上,它在stdio.h中定义为FILE(结构)。
stdin的类型为_IO_FILE,这是一个在某处明确定义的结构,可能在stdio.h中。如果没有,请检查stdio.h中包含的头文件,以获取_IO_FILE的定义。
答案 4 :(得分:0)
C标准明确指出stdin
是stdio.h
中定义的宏。不允许在其他任何地方定义它。
C11 7.21.1
"标题
<stdio.h>
定义了几个宏,...&#34; / - /&#34;宏是...&#34; / - /
<强> stderr的强>
的标准输入强>
stdout是“FILE指针”类型的表达式,指向FILE对象 分别与标准错误,输入和输出流相关联。
这个宏当然可以指向其他地方实现的实现细节,例如在&#34; stdio.c&#34;或者编译器库选择放置它的任何东西。