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

条件编译问题

[复制链接]
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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版