本文主要是介绍# 宏定义#ifndef、#define、#endif的作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
宏定义#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的作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!