宏定义#ifndef、#define、#endif的作用
三个宏用在头文件中,防止多个文件都引用时,造成重复声明,如下所示。一般格式是所有字母都大写,并且开头加底直线同时点也用直线代替,比如头文件为 stm32f10x.h,则写成下面的样式。
#ifndef __STM32F10x_H
#define __STM32F10x_H
...
#endif
我之前主要是裸机编程,一直是跟着用。但最近接触uC/OS时,我发现系统头文件名与宏定义不一样,如下图。


于是我深度了解了下,实际上不必刻板的认为这个宏定义像上面讲的那样是固定格式。直接分析宏的用法就直接了。
#ifndef CPU_MODULE_PRESENT
#define CPU_MODULE_PRESENT
...
#endif
以UCOSIII的文件为例,在预处理时,第一个宏,意为如果未定义CPU_MODULE_PRESENT,则定义CPU_MODULE_PRESENT,在第一次引用此头文件时,显然未定义CPU_MODULE_PRESENT,于是第一宏满足,则继续向下执行;第二句就被执行,即定义CPU_MODULE_PRESENT,然后继续执行直到#endif。当此头文件被其他文件再次引用时,编译器执行到#ifndef CPU_MODULE_PRESENT时,便不会再继续向下执行,因为上面讲到第一次处理时,第二个宏已经定义了CPU_MODULE_PRESENT,即再次编译时第一个宏执行结果为假,于是不再继续向下执行,所以就达到了不再重复编译头文件的功能。
综上所述,宏后面的变量不必为 “所有字母都大写,并且开头加底直线同时点也用直线代替” 这种格式,只要#ifndef和#define后面的变量保持相同即可,如头文件cpu.h可以写成下面这样。
#ifndef cpuu
#define cpuu
...
#endif

本文解析了宏定义#ifndef、#define、#endif在头文件中的作用,避免多个文件引用时重复声明。通过实例说明宏定义不必拘泥于特定格式,关键在于ifndef和#define后的变量需一致。

578

被折叠的 条评论
为什么被折叠?



