条件编译是先判断变量是否被宏定义吗

2019-07-14 15:39发布


条件编译不是先判断变量是否被宏定义,然后再执行下面的语句,为什么这段程序的 __STM32F10x_IT_H 是先条件编译再宏定义??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
djw200988
1楼-- · 2019-07-15 13:13
多个源文件或头文件可能交叉包含这个头文件,如果没用这部分,就重复了报错,这部分是防止重复的
servile
2楼-- · 2019-07-15 16:37
回复各位大神:
1.该头文件第一次被包含,执行语句 #ifndef __STM32F10x_LIB_H, __STM32F10x_LIB_H确实是没有被宏定义,下面语句顺利执行。
2.该头文件第二次被包含,执行语句 #ifndef __STM32F10x_LIB_H,但 __STM32F10x_LIB_H已经在第一次被宏定义过,那么下面语句不就不执行了,那岂不是出错了???
7762642422d
3楼-- · 2019-07-15 21:23
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”时要避免有重复名称,往往以双下划线+文件名来命名,因为文件名在同一目录下不能同名,但要注意不是同一目录下的相同文件名的头文件名。
servile
4楼-- · 2019-07-16 00:27
7762642422d 发表于 2018-11-28 12:41
1.根据图,编译器第一次包含该头文件时,在第17行时会判断“__STM32F10x_IT_H”是否定义过?显然没有定义过(除非你在其它地方定义了,当然根据实际需要我们是要避免这种情况的,所以才用一些非常奇怪的下划线和全大写等等,其目的就是为了不在别的头文件或源文件或编译器中定义该“__STM32F10x_IT_H”)。
2.编译器发现“_ ...

您的意思是头文件里的语句被编译过一次就行了吧,比如函数声明,第一次被某C源文件包含过了,当另一些C源文件想找到相应的函数,包不包含该头文件已经无所谓了,是这个意思吗?
kpj3026
5楼-- · 2019-07-16 05:40
 精彩回答 2  元偷偷看……
servile
6楼-- · 2019-07-16 09:54
kpj3026 发表于 2018-11-28 13:18
编绎器会自动链接已经编绎过的文件。只要有地方调用过一次,就会生成编绎文件,这时,如果其它文件也调用了这个文件,编绎器会自动识别并链接到这个文件。

一周热门 更多>