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

条件编译问题

[复制链接]
clyclycly 提问时间:2017-1-12 19:50 /
条件编译.jpg
条件编译不是先判断变量是否被宏定义,然后再执行下面的语句,为什么这段程序的 __STM32F10x_IT_H 是先条件编译再宏定义??
收藏 1 评论24 发布时间:2017-1-12 19:50

举报

24个回答
moyanming2013 回答时间:2017-1-13 14:47:33
clyclycly 发表于 2017-1-13 13:56
防止重复声明的机制使得头文件只能被执行一次,那多次包含岂不是多余,难道是为了提高程序的可读性?! ...

你不包含头文件怎么使用它们(头文件中声明的函数和变量)呢(赶紧改掉不声明头文件,什么都放在源文件里面的做法吧!)?
比如对于一个没有#include任何头文件的源文件,要想使用strstr()则必须至少包含string.h头文件。
多个源文件如若都会使用strstr,那么都得至少包含string.h。
你平时发现没有这样做是因为一些头文件已经包含了string.h了,而你只是包含了上层的头文件了。那么多包含自然会有“重复”,使用#ifndef可以避免编译器重复执行声明(这也是不允许的),但你在源文件中包含头文件是要引用一些已经声明的函数,两者不同。
建议你赶紧多读几遍最新版的《C语言程序设计:现代方法》:
http://item.jd.com/10064146.html

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

leo121_3006061 回答时间:2017-1-12 20:30:21
这个是程序编译器来判定编译的,你说的是程序运行吧,程序编译好之后,运行的时候自然是直接运行到那个宏定义的位置了,这是两个不太一样的事情,感觉你把两个搞混了,不知道我理解的对否?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

clyclycly 回答时间:2017-1-12 21:32:26
leo121_3006061 发表于 2017-1-12 20:30
这个是程序编译器来判定编译的,你说的是程序运行吧,程序编译好之后,运行的时候自然是直接运行到那个宏定义 ...

你是说程序编译时,__STM32F10x_IT_H就被宏定义了?
数码小叶 回答时间:2017-1-12 21:47:47
好着啊,防止重复定义,没错啊。。。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

海迹天涯 回答时间:2017-1-13 08:40:02
在复杂的嵌入式程序里面往往有多重包含关系,为了防止重复包含浪费ROM就这样定义了呗,自己理解的不知道对不对

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

ts2000 回答时间:2017-1-13 08:41:35
为了防止重复包含头文件。。。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2017-1-13 08:45:16
本帖最后由 any012 于 2017-1-13 08:48 编辑

防止重复定义。
一般的.h文件大都是这样的吧:
#ifndef   xxx_h
#define   xxx_h
...
#endif

如果没有这部分,多个.c文件包含这个.h文件的话,编译时会报错。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

creep 回答时间:2017-1-13 09:00:58
当第二次包含这个头文件的时候这个宏定义就起作用了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

风子 回答时间:2017-1-13 09:28:36
多个源文件或头文件可能交叉包含这个头文件,如果没用这部分,就重复了报错,这部分是防止重复的

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

clyclycly 回答时间:2017-1-13 09:57:43
回复各位大神:
1.该头文件第一次被包含,执行语句 #ifndef __STM32F10x_LIB_H, __STM32F10x_LIB_H确实是没有被宏定义,下面语句顺利执行。
2.该头文件第二次被包含,执行语句 #ifndef __STM32F10x_LIB_H,但 __STM32F10x_LIB_H已经在第一次被宏定义过,那么下面语句不就不执行了,那岂不是出错了???
123下一页

所属标签

相似问题

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