在c标准库中定义了stdin?

时间:2011-08-02 01:06:32

标签: c declaration stdin definition standard-library

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

extern struct _IO_FILE *stdin;

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

5 个答案:

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

C11 7.21.1

  

&#34;标题<stdio.h>定义了几个宏,...&#34; / - /

     

&#34;宏是...&#34; / - /

     

<强> stderr的
  的标准输入
   stdout

     

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

这个宏当然可以指向其他地方实现的实现细节,例如在&#34; stdio.c&#34;或者编译器库选择放置它的任何东西。