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

条件编译问题

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