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之间的代码编译进去(注意:是编译进去,不是执行!!)