stdio.c和stdio.h之间有什么区别?
如果不使用.c文件,无法在头文件中定义stdio函数和变量stdio.c和stdio.h之间有什么区别?,c,C,如果不使用.c文件,无法在头文件中定义stdio函数和变量 如果不是,那么.c文件的用途是什么 必须实现头文件中定义的功能。.c文件包含实现,尽管这些实现已经编译到编译器可以使用的静态或共享库中 头文件应该包含函数的最小描述,以节省编译时的时间。如果它包含整个源代码,那么每次编译时都会强制编译器重新编译它,这是非常浪费的,因为源代码从未更改 实际上,头文件充当如何与已编译库交互的备忘单 提供.c文件的原因主要是为了调试,因此调试器可以在调试构建中逐步执行,并向您显示源代码而不是原始机器代码。在极
如果不是,那么.c文件的用途是什么 必须实现头文件中定义的功能。
.c
文件包含实现,尽管这些实现已经编译到编译器可以使用的静态或共享库中
头文件应该包含函数的最小描述,以节省编译时的时间。如果它包含整个源代码,那么每次编译时都会强制编译器重新编译它,这是非常浪费的,因为源代码从未更改
实际上,头文件充当如何与已编译库交互的备忘单
提供.c
文件的原因主要是为了调试,因此调试器可以在调试构建中逐步执行,并向您显示源代码而不是原始机器代码。在极少数情况下,您可能希望查看特定函数的实现,以便更好地理解它,或者在更罕见的情况下,识别错误。它们实际上并不用于编译您的程序
在您的代码中,您应该只通过
#include
指令引用头文件版本.h
。有些语言,如果您想使用其他人编写的内容,您可以说
import module
这就解决了一切问题
C不是这些语言中的一种
您可以将“库”源代码放在一个文件中,然后使用#include
将其拉入需要的任何位置。但这根本行不通,原因有二:
#include
从两个不同的源文件将其拉入,然后将两个生成的对象文件链接在一起,“库”中的所有内容都将定义两次stdio.h
是一个标准头文件,需要由每个符合标准的托管C实现提供。它声明但不定义许多实体,主要是库函数,如putchar
和scanf
stdio.c
,如果它存在,很可能是一个c源文件,它定义了stdio.h
中声明的函数。不要求实现必须使其可用。它甚至可能不存在;例如,stdio.h
中声明的函数的实现可能出现在多个*.c
文件中
putchar
的声明是:
int putchar(int c);
这就是编译器在程序中看到对putchar
的调用时需要知道的全部内容。实现putchar
的代码通常作为机器代码提供,链接器的工作是解析putchar()
调用,以便最终调用该代码putchar()
甚至可能不是用C编写的(尽管可能是这样)
可以从多个
*.c
源文件构建可执行程序。整个程序只需要一个实现putchar
的代码副本。如果putchar
的实现在头文件中,那么它将包含在每个单独编译的源文件中,这会产生冲突,最多也会浪费空间。实现putchar()
(以及库中的所有其他函数)的代码只需编译一次。对于任何目的,.c
文件都有特定的功能。例如,stdio.c
文件具有标准的输入输出函数,可在c程序中使用。在stdio.h
头文件中,所有stdio.c
函数、所有定义、所有宏等都有函数原型。当包含在主code.c
文件中时,主代码假定存在“int printf(const char*format,…)
”函数。返回int
值,您可以传递参数。。。。。等等。当您调用printf()
函数时,实际上您使用的是stdio.c
文件。(回答者注意:这可能是前面问题的延续。)您知道编译(相对于解释)语言是什么吗?@SteveSummit是的我问的原因是,很明显,关于C的独立编译模型有些东西你不了解,但我不知道它是什么。如果函数和变量存在于.C文件中,为什么要首先使用.h文件?C是几十年前创建的,当时计算机时间很昂贵。它的许多规则,比如在使用函数之前必须声明函数,都是为了加快编译过程而设计的。现代语言通常没有这些限制,因为程序员不太在乎代码是在100毫秒还是300毫秒内编译的。但是回到70年代,1分钟或3分钟是一个更大的问题。一个.h
文件可以让编译器快速理解如何使用代码,而不必编译它。这在组装最终可执行文件时节省了大量时间。如果每次都要重新编译所有内容,即使对代码进行最微小的更改,也需要从头开始构建整个宇宙。如果说C使用头文件来声明将要使用/可能使用的函数和变量以及定义它们的.C文件,是否正确?Turbo Pascal就是最好的例子之一,模块是其中的一流功能语言和编译时间都非常快。C虽然离它不远,但一旦运行它就会快得多,这就是为什么人们使用C而不是Pascal。好消息是C++最终会得到模块,所以编译时间可能会相应地提高一堆。@ TADMAN:不仅仅是“模块作为语言特征”。在这里提到的要点中,C/C++编译器并没有转向