gpt4 book ai didi

c++ - C/C++ 编译器如何在头文件中找到原型(prototype)的定义?

转载 作者:IT老高 更新时间:2023-10-28 21:45:49 28 4
gpt4 key购买 nike

当我在头文件中声明一个函数,并将该函数的定义放在其他文件中时,编译器/链接器如何找到定义?它会系统地搜索其路径中的每个文件,还是有更优雅的解决方案?这几天一直困扰着我,一直找不到解释。

最佳答案

编译器不会这样做,链接器会这样做。

当编译器一次处理一个源文件时,当调用链接器时,它会传递编译器生成的所有目标文件的名称,以及用户希望链接的任何库的名称。因此,链接器完全了解可能包含该定义的文件集,并且只需要查看这些目标文件的符号表。除此之外,它不需要进行任何搜索。

例如,假设您有 foo.h 和 foo.c 定义和实现函数 foo(),而 bar.h 和 bar.c 定义和实现 bar()。假设 bar 调用 foo 以便 bar.c 包含 foo.h。此编译分为三个步骤:

gcc -c foo.c
gcc -c bar.c
gcc foo.o bar.o -o program

第一行编译 foo.c,生成 foo.o。第二个编译 bar.c,生成 bar.o。此时,在目标文件 bar.o 中,foo 是一个外部符号。第三行调用链接器,它将 foo.o 和 bar.o 链接到一个名为“program”的可执行文件中。当链接器处理 bar.o 时,它会看到未解析的外部符号 foo,因此它会查看所有其他正在链接的目标文件(在本例中为 foo.o)的符号表并找到foo 在 foo.o 中,并完成链接。

对于库,这有点复杂,它们出现在命令行上的顺序可能取决于您的链接器,但通常是相同的原则。

关于c++ - C/C++ 编译器如何在头文件中找到原型(prototype)的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3368121/

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