你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
查看全部评分
安 发表于 2018-8-16 17:03 从理解上来,是先编译的.C时,从include顺序编译.H。
wenyangzeng 发表于 2018-8-16 17:38 比如在main.c中: #include “main.h” 编译时就把main.h一起编译进去了。
wwwheihei 发表于 2018-8-16 17:44 那比如我的led.c里面包含了adc.h,wwdg.h,sim800.h,gprs.h,但是我真的led.c里面的函数只是调用了一个adc.h ...
安 发表于 2018-8-17 08:19 .h中一般加了ifndef的是才进行编译,所以编译只有一次。一般是从编译.c开始。比如编译的第一个文件是led.c ...
预编译,编译,链接。
不管是h还是c文件,其实作用都是一样的,没有什么头文件和源代码文件区分,当然这个理解是基于编译器的,而不是对人的,所以看官别看了就开始喷。例如,我可以再c文件里包含c文件,也可以再h文件里包含c文件,可以再h文件里包含h文件,当然c文件也可以包含h文件,随你喜欢。
预编译,其实就是编译器会先把所有文件中的宏都给展开,这里包含条件编译,常量等等,各位看官也可以再自身的编译器中查看list文件,这是预编译后产生的文件。
然后再进行汇编,把所有的源代码(这里不指明是c还是h,应该可以说是都存在),生成.o文件,
接下来进行链接,最后生成总的hex或者elf或者axf之类的格式文件,当然可以再生成bin文件。
最后 补充的就是,以上这个过程,不管是什么平台,什么ide,什么编译器,都是一样的步骤。
评分
查看全部评分
编译的时候c文件编译过程中,会把同名头文件一起编译进去,最后会得到.o的文件,在这个阶段,编译器会把所有的函数都编译进去,并分配一个函数入口地址。
在链接的时候,会根据实际程序的调用,将这些函数都拼接在一起,用到的才会被拼接起来, 没有用到的就不管,最后打包成了hex或者bin文件,所以你看每个项目,output文件夹都是几十M的,但实际bin或者hex文件才一两百k。
评分
查看全部评分
具体一点呢?
评分
查看全部评分
#include “main.h”
编译时就把main.h一起编译进去了。
评分
查看全部评分
那比如我的led.c里面包含了adc.h,wwdg.h,sim800.h,gprs.h,但是我真的led.c里面的函数只是调用了一个adc.h,那么编译器会不会多编译东西进去?(直接包含所有头文件和我直接在led。c里面包含adc。c)这么编译有区别吗?
.h中extern的内容不会编译,只是告诉编译器,在别的地方已经有定义过了,到时候链接的时候自己会去找。
评分
查看全部评分
你编译的.h文件当然都编译进去了,等待你其他函数的调用。分别的include没有编译全部.h文件,节省一点内存。
其实你亲自动手体验一下就有知道了。
评分
查看全部评分
评分
查看全部评分
有没有相关的资料,详细讲解这部分的文章或者pdf
所以编译时会根据main所用到的从.h文件去寻找相关
评分
查看全部评分