【问题标题】:where is stdin defined in c standard library?c标准库中的stdin在哪里定义?
【发布时间】:2011-08-02 01:06:32
【问题描述】:

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

extern struct _IO_FILE *stdin;

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

【问题讨论】:

    标签: c declaration stdin definition standard-library


    【解决方案1】:

    它在 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】:

      我相信它是在 stdio.c 中定义的,它被编译到 libc 中(在基于 gnu 的系统上)

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 不,那是声明定义在 C 库源代码中。
        • 我不关注。在我看来 FILE 是在我的系统上 stdio.h 的第 132-163 行定义的,其中指定了它的所有成员。这不构成结构的定义吗?
        • @bcr:它定义了结构 type。它没有定义 object stdin.
        • 抱歉,我以为亚当指的是我的第二个“定义”……我很抱歉。
        【解决方案4】:

        在标准库代码中,还有哪里?在附近的 Linux 机器中,它位于 libc.a:stdio.o,使用 nm -o /usr/lib/libc.a | grep stdin | grep D 找到。如果您想阅读一些代码,请参阅GNU C Library

        【讨论】:

          【解决方案5】:

          C 标准明确指出stdin 是在stdio.h 中定义的宏。不允许在其他任何地方定义。

          C11 7.21.1

          "标题<stdio.h>定义了几个宏,..." /--/

          "宏是..." /--/

          stderr
          stdin
          stdout

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多