#ifdef、#ifndef、#if

1、#ifdef(如果被定义)
先看#ifdef的用法:

#define   KEY1_PA0

#ifdef    KEY1_PA0
-------------第一段-----------------
#define               macKEY1_GPIO_CLK                      RCC_APB2Periph_GPIOA
#define               macKEY1_GPIO_PORT                     GPIOA              
#define               macKEY1_GPIO_PIN                        GPIO_Pin_0

#else    //KEY2_PC13
-------------第二段-----------------
#define               macKEY1_GPIO_CLK                      RCC_APB2Periph_GPIOC
#define               macKEY1_GPIO_PORT                     GPIOC          
#define               macKEY1_GPIO_PIN                        GPIO_Pin_13

#endif

如果定义过 KEY1_PA0,就执行第一段代码,否则就执行第二段代码!!

延伸一下

在iOS中实现在DEBUG模式打印相应的内容,而在其他模式不会打印,可以这样实现

#ifdef __OBJC__   // __OBJC__这个宏,宏内引用的文件确保只被使用Objective-C语言的文件所引用,限定仅仅被OC代码使用  
#ifdef DEBUG  
#define NSLog(...) NSLog(__VA_ARGS__)  
#else  
##define NSLog(...) {}   
#endif  
#endif  

注意,一个#ifdef 就要对应一个#endif
2、#ifndef(如果没有被定义)
再看#ifndef的用法:

 #ifndef <标识>

  #define <标识>

  ......

  #endif

  <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

  #ifndef STDIO_H

在文件bsp_usart1.h中:

#ifndef __USART1_H
#define    __USART1_H

//statement.

#endif  // usart1.h

如果没有define过__USART1_H,就执行下面的语句;如果定义过,就不执行;

所以在一个.c文件里面,多次调用到该文件的时候,就相当于只调用一次。

这是头文件的常用写法!!

比如:

在文件main.c中:

#include "stm32f10x.h"

#include "bsp_usart1.h"

在bsp_usart1.h中:

#include "stm32f10x.h"

在stm32f10x.h中:

#ifndef __STM32F10x_H
#define __STM32F10x_H

#endif

分析:

(1)、在main.c中调用了一次文件stm32f10x.h,调用的时候发现__STM32F10x_H并没有被define,所以就执行#ifndef - #endif之间的代码,

执行过后,就相当于define了__STM32F10x_H;

(2)、当在bsp_usart1.h中再次调用文件stm32f10x.h的时候,发现__STM32F10x_H已经被define过了,所以这时就不再执行#ifndef - #endif 之间的代码了!

如果没有#ifndef的话,在这里,stm32f10x.h文件里面,如果有定义变量之类的,就会报重定义的错误。

所以这种写法的作用有:防止重复定义!!
3.#if(条件判断)
#if的后面接的是表达式,如果表达式为1,则编译#if下面的代码

#if (SUM==1)||(SUM==0)
code...
#endif

或者

#if SUM
code...
#endif

它的作用是:如果#if后的表达式成立,即为真,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)

猜你喜欢

转载自blog.csdn.net/qq_39551390/article/details/80640416