【问题标题】:What does '#include <stdio.h>' really do in a C program'#include <stdio.h>' 在 C 程序中真正做了什么
【发布时间】:2013-10-05 23:10:56
【问题描述】:

我是 c 编程的新手,我正在编写一些简单的“Hello world”风格的程序。

在所有这些程序中,我将#include&lt;stdio.h&gt; 放在顶部,但我不确定这究竟意味着什么。我用谷歌搜索,发现 stdio.h 是一个包含预处理器命令的文件,但什么是预处理器?我想当我编写代码时,我编译它,我的代码转换为“计算机”可以读取的形式,然后我可以运行它。谁能给我解释一下这个命令的用途是什么?

【问题讨论】:

  • @Nat95 SO 不是一个论坛,您只需要提供解决方案,SO 想要传播知识。因此,不欢迎以单个链接形式回答堆栈溢出。答案应该由知道答案的人拼写。并可以向你解释。所以避免要求链接或场外资源。
  • 好的!我不知道这个!谢谢@Zaibis

标签: c include stdio


【解决方案1】:

它查找stdio.h 文件并有效地将其复制粘贴到此#include 语句的位置。这个文件包含了函数的所谓函数原型,例如printf()scanf(),...以便编译器知道它们的参数和返回值是什么。

【讨论】:

  • 好的,所以当我使用 printf 时,实现 printf 的代码位于 stdio.h 中?我可以实现我的 printf 版本吗(我知道这样做很愚蠢,但可以说..)?
  • @Nat95:不,printf函数的代码不在stdio.h中,只是函数定义。链接器稍后会在链接到标准库时解决此问题。您绝对可以编写自己的 printf 函数。
  • +1 这是迄今为止对预处理器有效地使用#include 所做的最好和最简单的解释。顺便说一句,如果您指示编译器/构建系统保留预处理文件,您可以看到这一点。
  • 要查看粘贴在实际代码上方的头文件的内容,使用-E 选项编译源代码,您将能够看到特定头文件的函数原型包含。 @Lucas:一个拼写错误是函数原型或声明而不是函数定义。
  • 我建议提到文件名的意思是“标准输入输出标题”
【解决方案2】:

最简单的解释也许应该是您的程序调用或使用了许多其代码不属于您的程序本身的函数。例如如果您在代码中编写“printf”来打印某些内容,编译器不知道如何处理该调用。

stdio.h 是该 printf 信息所在的位置。

更新:

printf 函数的原型(名称、返回类型和参数)驻留在stdio.h 中。这在编译阶段都是必需的。 printf 的实际代码包含在编译之后的链接阶段。

include 语句基本上在实际编译之前插入所有函数原型。因此得名预处理器。

更新 2:

由于问题集中在 include 语句上(并且 OP 还询问了关于自己编写函数定义的问题,另一个重要方面是它是否像这样写(注意尖括号)

#include <stdio.h>

预处理器假定它是一个标准库头文件,并首先在安装了编译器的系统文件夹中查找。

如果程序员自己定义一个函数并将 .h 文件放在当前工作目录中,他会使用(注意双引号)

#include "stdio.h"

Following 说明了这一点,并且该行为可在所有平台上移植。

【讨论】:

  • 好的,所以当我使用 printf 时,实现 printf 的代码位于 stdio.h 中?我可以实现我的 printf 版本吗(我知道这样做很愚蠢,但可以说..)?
  • 是的,你可以这样做。请理解我的上述回答过于简单化了。但这是正确的概念。随着我们深入,您可能会看到很多细节。实际上,十多年前,我在我的第一个 BSc 编程课程中编写了一个更新版本的 printf。这涉及直接访问视频内存并通过指针写入特定地址。
  • 澄清一下,有 .h 文件,也有 .c 文件。 h 文件只包含函数原型,即告诉函数名称、返回类型和参数是什么。实际定义位于编译后的链接阶段。
  • 没问题。很高兴我能帮上忙
【解决方案3】:

它告诉编译器使用文件 sdtio.h 中的函数、结构、宏等,它代表 glibc 的一部分(或任何你得到的标准 C 库)。编译器还将记录添加到输出可执行文件“to-link list”,它应该链接到标准 C 库。

【讨论】:

    【解决方案4】:

    源代码中的预处理器指令是在程序编译之前处理的语句,在此步骤之后,源代码被转换为扩展的源代码,因为它现在包含对已经定义的函数的引用标准 C 库(或任何其他),如 printf、scanf、putw、getchar 等。 stdio.h 是一个带有“.h”扩展名的文件,其中包含 c 中使用的标准输入输出函数的原型(不是定义)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多