4 c
在阅读库源代码时,我看到有相同名称的文件.c和.h文件.在主源中,.h包含文件但不包含.c文件.当我看代码的.h文件,它也不会#include在.c同一个名字的文件.我错过了什么吗?.c当.h同名文件是#include'd?时,编译器是否自动包含文件?
典型.h文件用作文件的"目录" .c,包括诸如函数原型,typedef等之类的东西.程序包括.h使他们了解功能和类型.
这些.c文件是单独编译的,并生成包含实际代码的目标文件(.o或.obj).
然后通过Makefile,Project文件或类似方法将目标文件绑定到主程序.然后,目标文件与主程序链接,产生一个功能整体.
在库的情况下,是没有主程序.目标文件收集在一起并以特殊格式(对于静态或动态库).使用该库的任何程序都将包含.h上述内容,并链接到库.
没有魔力.编译C程序时,有两个主要步骤.
首先,每个编译单元都是隔离编译的.(编译单元基本上是一个.c文件,加上它包含的所有内容).
在这个阶段,它不知道其他.c文件中包含的内容,这意味着它无法生成完整的程序.它能做的是生成一些带有"填空"点的代码.如果从foo.c调用一个在bar.h中声明并在bar.c中定义的函数,则编译器只能看到该函数存在.它在声明bar.h,所以我们必须假设完整定义存在somewher.但由于该定义位于另一个编译单元内,我们还不能看到它.因此编译器会生成调用该函数的代码,并在其上注明"在实际知道后填写此函数的地址".
一旦每个编译单元都以这种方式编译,你就会得到一堆目标文件(如果你用GCC编译,通常是.o,如果你使用MSVC则是.obj),包含这种"填空"代码.
现在链接器获取所有这些目标文件,并尝试将它们合并在一起,这允许它填充空白.现在可以找到我们为上面生成调用的函数,因此我们可以将其地址插入到调用中.
因此,如果.c文件与.h具有相同的名称,则不会发生任何特殊情况.这只是一个让人类更容易弄清楚每个文件中的内容的惯例.
编译器不关心.它只需要每个.c文件,以及它包含的任何内容,并将其编译为目标文件.然后链接器将所有这些目标文件合并为一个可执行文件.
不需要.h文件中不需要包含.c文件..h文件通常不直接作为编译器输入传递,但其唯一目的是包含在其他文件中.
通常,它是这样的:
"a.c" includes "a.h"
"b.c" includes "c.h"
Run Code Online (Sandbox Code Playgroud)
编译"ac"和"bc"并链接输出文件.
| 归档时间: |
|
| 查看次数: |
4174 次 |
| 最近记录: |