1、先看#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,就執行第一段代碼,否則就執行第二段代碼!!
2、#ifndef的用法:
在文件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文件里面,如果有定義變量之類的,就會報重定義的錯誤。
所以這種寫法的作用有:防止重復定義!!