你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

谁知道keil .c 和.h 文件的大概的编译过程,我们都知道...

[复制链接]
wwwheihei 提问时间:2018-8-16 16:58 /
谁知道keil   .c 和.h    文件的大概的编译过程,我们都知道一个模块的函数调用另一个模块的函数,是调用他的.h文件 ,那么这么推断的话,keil应该是把所有的.h文件全都编译了,然后再去编译.c文件,这么想对吗?
收藏 评论22 发布时间:2018-8-16 16:58

举报

22个回答
Inc_brza 回答时间:2018-8-17 17:08:01
其实楼上各位说的有对也有错,如14楼所说,需要区分下编译,链接,但是我想补充一下,最好区分一下
预编译,编译,链接。
不管是h还是c文件,其实作用都是一样的,没有什么头文件和源代码文件区分,当然这个理解是基于编译器的,而不是对人的,所以看官别看了就开始喷。例如,我可以再c文件里包含c文件,也可以再h文件里包含c文件,可以再h文件里包含h文件,当然c文件也可以包含h文件,随你喜欢。
预编译,其实就是编译器会先把所有文件中的宏都给展开,这里包含条件编译,常量等等,各位看官也可以再自身的编译器中查看list文件,这是预编译后产生的文件。
然后再进行汇编,把所有的源代码(这里不指明是c还是h,应该可以说是都存在),生成.o文件,
接下来进行链接,最后生成总的hex或者elf或者axf之类的格式文件,当然可以再生成bin文件。
最后 补充的就是,以上这个过程,不管是什么平台,什么ide,什么编译器,都是一样的步骤。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

回答时间:2018-8-16 17:03:28
从理解上来,是先编译的.C时,从include顺序编译.H。
wwwheihei 回答时间:2018-8-16 17:20:41
安 发表于 2018-8-16 17:03
从理解上来,是先编译的.C时,从include顺序编译.H。

具体一点呢?
cugxiao 回答时间:2018-8-16 17:37:18
按照你的程序编译所有涉及到的C文件,头文件里面只有申明,作用相当于在main.c里面声明,分在对应的头文件里申明只是为了方便管理代码,包括文件的起名也是为了方便管理代码

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-8-16 17:38:06
比如在main.c中:
#include “main.h”
编译时就把main.h一起编译进去了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wwwheihei 回答时间:2018-8-16 17:44:07
wenyangzeng 发表于 2018-8-16 17:38
比如在main.c中:
#include “main.h”
编译时就把main.h一起编译进去了。

那比如我的led.c里面包含了adc.h,wwdg.h,sim800.h,gprs.h,但是我真的led.c里面的函数只是调用了一个adc.h,那么编译器会不会多编译东西进去?(直接包含所有头文件和我直接在led。c里面包含adc。c)这么编译有区别吗?
toofree 回答时间:2018-8-16 17:58:58
.h文件是被包含进.c的,也就相当于把.h 的内容加到.c中。
.h中extern的内容不会编译,只是告诉编译器,在别的地方已经有定义过了,到时候链接的时候自己会去找。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-8-16 19:06:19
本帖最后由 wenyangzeng 于 2018-8-17 07:17 编辑
wwwheihei 发表于 2018-8-16 17:44
那比如我的led.c里面包含了adc.h,wwdg.h,sim800.h,gprs.h,但是我真的led.c里面的函数只是调用了一个adc.h ...

你编译的.h文件当然都编译进去了,等待你其他函数的调用。分别的include没有编译全部.h文件,节省一点内存。
其实你亲自动手体验一下就有知道了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-8-16 23:48:09
.h文件是头文件,内含函数声明、宏定义、结构体定义等内容,.c文件是程序文件,内含函数实现,变量定义等内容。而且是什么后缀也没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。你可以强制编译器把任何后缀的文件都当作c文件来编。
回答时间:2018-8-17 08:19:36
.h中一般加了ifndef的是才进行编译,所以编译只有一次。一般是从编译.c开始。比如编译的第一个文件是led.c,那么在开头调用的.h会优先编译,.h中再调用的.h,优先编译。大概意思是这样,具体还是需要自己去理解。可能每个人的理解不一样,但是编译的机制是一样的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版