完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
相关推荐
24个回答
|
|
|
这个是程序编译器来判定编译的,你说的是程序运行吧,程序编译好之后,运行的时候自然是直接运行到那个宏定义的位置了,这是两个不太一样的事情,感觉你把两个搞混了,不知道我理解的对否?
|
|
|
|
|
z820139598 发表于 2018-11-28 10:29 你是说程序编译时,__STM32F10x_IT_H就被宏定义了? |
|
|
|
|
|
好着啊,防止重复定义,没错啊。。。
|
|
|
|
|
|
在复杂的嵌入式程序里面往往有多重包含关系,为了防止重复包含浪费ROM就这样定义了呗,自己理解的不知道对不对
|
|
|
|
|
|
为了防止重复包含头文件。。。
|
|
|
|
|
|
本帖最后由 any012 于 2017-1-13 08:48 编辑
防止重复定义。 一般的.h文件大都是这样的吧: #ifndef xxx_h #define xxx_h ... #endif 如果没有这部分,多个.c文件包含这个.h文件的话,编译时会报错。 |
|
|
|
|
|
当第二次包含这个头文件的时候这个宏定义就起作用了。
|
|
|
|
|
|
多个源文件或头文件可能交叉包含这个头文件,如果没用这部分,就重复了报错,这部分是防止重复的
|
|
|
|
|
|
回复各位大神:
1.该头文件第一次被包含,执行语句 #ifndef __STM32F10x_LIB_H, __STM32F10x_LIB_H确实是没有被宏定义,下面语句顺利执行。 2.该头文件第二次被包含,执行语句 #ifndef __STM32F10x_LIB_H,但 __STM32F10x_LIB_H已经在第一次被宏定义过,那么下面语句不就不执行了,那岂不是出错了??? |
|
|
|
|
|
1.根据图,编译器第一次包含该头文件时,在第17行时会判断“__STM32F10x_IT_H”是否定义过?显然没有定义过(除非你在其它地方定义了,当然根据实际需要我们是要避免这种情况的,所以才用一些非常奇怪的下划线和全大写等等,其目的就是为了不在别的头文件或源文件或编译器中定义该“__STM32F10x_IT_H”)。
2.编译器发现“__STM32F10x_IT_H”没有定义该头文件,那么执行第18行,定义该“__STM32F10x_IT_H”。并执行剩余的头文件内容,比如声明函数。 3.如果有多个源文件都包含了该头文件,那么只有第一次编译器执行该头文件的时候才会扫描该头文件,其余都不会再次执行该头文件了,因为第2次及以上进入它都已经定义过“__STM32F10x_IT_H”了。 4.在多次被包含时,如果不采用上述机制,那么可能会出现变量或函数多次声明的问题。 5.上述机制就是要避免对于头文件可能执行多次的问题。为了达到此功能,在定义“__STM32F10x_IT_H”时要避免有重复名称,往往以双下划线+文件名来命名,因为文件名在同一目录下不能同名,但要注意不是同一目录下的相同文件名的头文件名。 |
|
|
|
|
7762642422d 发表于 2018-11-28 12:41 您的意思是头文件里的语句被编译过一次就行了吧,比如函数声明,第一次被某C源文件包含过了,当另一些C源文件想找到相应的函数,包不包含该头文件已经无所谓了,是这个意思吗? |
|
|
|
|
|
编绎器会自动链接已经编绎过的文件。只要有地方调用过一次,就会生成编绎文件,这时,如果其它文件也调用了这个文件,编绎器会自动识别并链接到这个文件。
|
|
|
|
|
kpj3026 发表于 2018-11-28 13:18 |
|
|
|
|
|
防止头文件重复包含吧
|
|
|
|
|
servile 发表于 2018-11-28 13:01 上面的回复说的是为什么要那么写以及其意义是什么。 如果你要引用头文件里面的函数或变量,一定要包含头文件的,跟头文件里面为了防止重复声明的机制无关。 |
|
|
|
|
|
多个源文件或头文件可能交叉包含这个头文件,如果没用这部分,就重复了报错,这部分是防止重复的
|
|
|
|
|
|
学习了
|
|
|
|
|
7762642422d 发表于 2018-11-28 13:56 防止重复声明的机制使得头文件只能被执行一次,那多次包含岂不是多余,难道是为了提高程序的可读性?! |
|
|
|
|
|
你不包含头文件怎么使用它们(头文件中声明的函数和变量)呢(赶紧改掉不声明头文件,什么都放在源文件里面的做法吧!)? 比如对于一个没有#include任何头文件的源文件,要想使用strstr()则必须至少包含string.h头文件。 多个源文件如若都会使用strstr,那么都得至少包含string.h。 你平时发现没有这样做是因为一些头文件已经包含了string.h了,而你只是包含了上层的头文件了。那么多包含自然会有“重复”,使用#ifndef可以避免编译器重复执行声明(这也是不允许的),但你在源文件中包含头文件是要引用一些已经声明的函数,两者不同。 建议你赶紧多读几遍最新版的《C语言程序设计:现代方法》: https://item.jd.com/10064146.html |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:55 , Processed in 1.194013 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3000