函数引用时的一点疑惑

时间会戳穿你的谎言 2011-09-02 09:36:32
C中函数在头文件中声明,定义却在另外.c文件中,函数被引用时只声明了头文件,那么编译器是如何找到定义函数的.c文件呢?
...全文
94 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 devil_2009 的回复:]
有点明白了,也就说在编译阶段,编译器会把所有的文件-头文件和.c文件都进行……
[/Quote]
嗯。差不多。
基本上,编译阶段是以.c文件为单位的,每次只编译一个.c文件。
只要到了连接阶段,所有的东西才串到一起。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
具体来说,编译器不必找到函数定义在哪儿,连接器能找到就可以了。

一般情况下,当连接产生最终的可执行文件时,连接器会在当前连接的目标文件和相关的库文件中查找符号定义,其中包括函数定义。

C语言的构建模式是典型的编译、连接彼此分离的模式。编译阶段不查找外部符号。
[/Quote]
有点明白了,也就说在编译阶段,编译器会把所有的文件-头文件和.c文件都进行编译。变量及函数虽然在不同的位置被声明和定义,但是编译生成的符号是唯一的。之后链接器就会根据符号及符号地址进行操作了。
AnYidan 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
具体来说,编译器不必找到函数定义在哪儿,连接器能找到就可以了。

一般情况下,当连接产生最终的可执行文件时,连接器会在当前连接的目标文件和相关的库文件中查找符号定义,其中包括函数定义。

C语言的构建模式是典型的编译、连接彼此分离的模式。编译阶段不查找外部符号。
[/Quote]

++
jackyjkchen 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
具体来说,编译器不必找到函数定义在哪儿,连接器能找到就可以了。

一般情况下,当连接产生最终的可执行文件时,连接器会在当前连接的目标文件和相关的库文件中查找符号定义,其中包括函数定义。

C语言的构建模式是典型的编译、连接彼此分离的模式。编译阶段不查找外部符号。
[/Quote]

++
连接器的活
Leaveye 2011-09-02
  • 打赏
  • 举报
回复
编译器 产生的目标文件只有符号及符号地址。
连接器 通过将所有需要的符号所在的目标文件融合进一体,也借此消除符号(非debug)建立跳转。

IDE 帮你做了配置这些的工作,其关系全都保存在工程文件中。

如果要手动做这些,你就需要学习编写 makefile 了。
limang89 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
具体来说,编译器不必找到函数定义在哪儿,连接器能找到就可以了。

一般情况下,当连接产生最终的可执行文件时,连接器会在当前连接的目标文件和相关的库文件中查找符号定义,其中包括函数定义。

C语言的构建模式是典型的编译、连接彼此分离的模式。编译阶段不查找外部符号。
[/Quote]

+1
晨星 2011-09-02
  • 打赏
  • 举报
回复
具体来说,编译器不必找到函数定义在哪儿,连接器能找到就可以了。

一般情况下,当连接产生最终的可执行文件时,连接器会在当前连接的目标文件和相关的库文件中查找符号定义,其中包括函数定义。

C语言的构建模式是典型的编译、连接彼此分离的模式。编译阶段不查找外部符号。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧