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

条件编译问题

[复制链接]
clyclycly 提问时间:2017-1-12 19:50 /
阅读主题, 点击返回1楼
收藏 1 评论24 发布时间:2017-1-12 19:50
24个回答
moyanming2013 回答时间:2017-1-13 10:05:00
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”时要避免有重复名称,往往以双下划线+文件名来命名,因为文件名在同一目录下不能同名,但要注意不是同一目录下的相同文件名的头文件名。
clyclycly 回答时间:2017-1-13 10:29:40
moyanming2013 发表于 2017-1-13 10:05
1.根据图,编译器第一次包含该头文件时,在第17行时会判断“__STM32F10x_IT_H”是否定义过?显然没有定义过 ...

您的意思是头文件里的语句被编译过一次就行了吧,比如函数声明,第一次被某C源文件包含过了,当另一些C源文件想找到相应的函数,包不包含该头文件已经无所谓了,是这个意思吗?
hjl2832 回答时间:2017-1-13 10:57:14
编绎器会自动链接已经编绎过的文件。只要有地方调用过一次,就会生成编绎文件,这时,如果其它文件也调用了这个文件,编绎器会自动识别并链接到这个文件。

评分

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

查看全部评分

clyclycly 回答时间:2017-1-13 11:22:48
hjl2832 发表于 2017-1-13 10:57
编绎器会自动链接已经编绎过的文件。只要有地方调用过一次,就会生成编绎文件,这时,如果其它文件也调用了 ...

霹雳之火 回答时间:2017-1-13 11:42:48
防止头文件重复包含吧

评分

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

查看全部评分

moyanming2013 回答时间:2017-1-13 11:59:51
clyclycly 发表于 2017-1-13 10:29
您的意思是头文件里的语句被编译过一次就行了吧,比如函数声明,第一次被某C源文件包含过了,当另一些C源 ...

上面的回复说的是为什么要那么写以及其意义是什么。
如果你要引用头文件里面的函数或变量,一定要包含头文件的,跟头文件里面为了防止重复声明的机制无关。
zbber 回答时间:2017-1-13 13:14:55
多个源文件或头文件可能交叉包含这个头文件,如果没用这部分,就重复了报错,这部分是防止重复的
海迹天涯 回答时间:2017-1-13 13:39:44
学习了
clyclycly 回答时间:2017-1-13 13:56:32
moyanming2013 发表于 2017-1-13 11:59
上面的回复说的是为什么要那么写以及其意义是什么。
如果你要引用头文件里面的函数或变量,一定要包含头 ...

防止重复声明的机制使得头文件只能被执行一次,那多次包含岂不是多余,难道是为了提高程序的可读性?!
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

查看全部评分

所属标签

相似问题

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