gpt4 book ai didi

c - 如何链接同名的 .c 和 .h 文件?

转载 作者:太空狗 更新时间:2023-10-29 15:09:47 25 4
gpt4 key购买 nike

在阅读库源代码时,我看到有同名的.c.h 文件。在主源代码中,包含.h 文件但不包含.c 文件。当我查看 .h 文件中的代码时,它也没有 #include 同名的 .c 文件。我错过了什么吗?当同名的 .h 文件被 #include 时,编译器是否自动包含 .c 文件?

最佳答案

没有魔法。编译 C 程序时,有两个主要步骤。

首先,每个单独的编译单元都是独立编译的。 (一个编译单元基本上是一个 .c 文件,加上它包含的所有内容)。

在这个阶段,它对其他 .c 文件中包含的内容一无所知,这意味着它无法生成完整的程序。它可以做的是生成带有一些“填空”点的代码。如果从 foo.c 中调用在 bar.h 中声明并在 bar.c 中定义的函数,则编译器只能看到该函数存在。它在 bar.h 中声明,因此我们必须假设完整的定义存在于某处。但是因为该定义在另一个编译单元中,所以我们还看不到它。因此,编译器生成调用该函数的代码,并在上面加上一点注释,写着“一旦知道该函数的地址,就填写它”。

一旦每个编译单元都以这种方式编译,你就会留下一堆目标文件(如果是 GCC 编译的通常是 .o,如果你使用 MSVC 编译的通常是 .obj),包含这种“填空” "代码。

现在链接器获取所有这些目标文件,并尝试将它们合并在一起,这样就可以填补空白。现在可以找到我们为上面生成的调用的函数,因此我们可以将其地址插入到调用中。

因此,如果 .c 文件与 .h 文件同名,则不会发生任何特殊情况。这只是一种约定,让人们更容易弄清楚每个文件中的内容。

编译器不关心。它只需要每个 .c 文件,加上它包含的任何内容,并将其编译为一个目标文件。然后链接器将所有这些目标文件合并到一个可执行文件中。

关于c - 如何链接同名的 .c 和 .h 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/960560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com