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

谁知道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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版