预编译
很好理解,包含#ifdef、#ifndef等关键字,面向编译器,使其根据条件选择性地编译或放弃部分代码
预编译实现环境界定
写库函数时,利用条件预编译可以界定环境、避免后续调用错误的库
写嵌入式驱动时,利用条件预编译,可以避免让用户手动添加大部分环境内容
在stm32相关库中,可以按照以下模板编写
#ifdef __CODEVISIONAVR__ //环境定义
/*操作*/
#elif defined(__GNUC__) && !defined(USE_HAL_DRIVER)//标准库
/*操作*/
#elif defined(USE_HAL_DRIVER)
/*操作*/
#endif
最近的一次编程中,使用的环境界定如下
#ifdef defined(__GNUC__) && !defined(USE_HAL_DRIVER) //编译器定义
#pragma GCC diagnostic ignored "-Wunused-function" /* Disable 'unused function' warning */
#elif defined(USE_HAL_DRIVER)
#include "main.h"
#ifdef STM32F0
#include "stm32f0xx_hal.h" /* Import HAL library */
#elif defined(STM32F1)
#include "stm32f1xx_hal.h" /* Import HAL library */
#elif defined(STM32F2)
#include "stm32f2xx_hal.h" /* Import HAL library */
#elif defined(STM32F3)
#include "stm32f3xx_hal.h" /* Import HAL library */
#elif defined(STM32F4)
#include "stm32f4xx_hal.h" /* Import HAL library */
#elif defined(STM32F7)
#include "stm32f7xx_hal.h" /* Import HAL library */
#elif defined(STM32G0)
#include "stm32g0xx_hal.h" /* Import HAL library */
#elif defined(STM32G4)
#include "stm32g4xx_hal.h" /* Import HAL library */
/* ------------ Check High Performance series ------------ */
#elif defined(STM32H7)
#include "stm32h7xx_hal.h" /* Import HAL library */
/* ------------ Check Ultra low power series ------------- */
#elif defined(STM32L0)
#include "stm32l0xx_hal.h" /* Import HAL library */
#elif defined(STM32L1)
#include "stm32l1xx_hal.h" /* Import HAL library */
#elif defined(STM32L5)
#include "stm32l5xx_hal.h" /* Import HAL library */
#elif defined(STM32L4)
#include "stm32l4xx_hal.h" /* Import HAL library */
#elif defined(STM32H7)
#include "stm32h7xx_hal.h" /* Import HAL library */
#else
#endif /* STM32F1 */
#if defined ( __ICCARM__ ) /* ICCARM Compiler */
#pragma diag_suppress=Pe177 /* Disable 'unused function' warning */
#elif defined ( __GNUC__ ) /* GNU Compiler */
#pragma diag_suppress 177 /* Disable 'unused function' warning */
#endif /* __ICCARM__ */
#else
#error Chip || Library not supported
#endif
定时函数界定
编写驱动、组件时,用户往往会因为定时器资源的调用、复用耽误很多功夫,可以参考以下内容进行定时器调用相关函数(以获取计时数为例)
#ifdef GetTime//定时函数定义
#ifdef __CODEVISIONAVR__//默认编译器
#define GetTime() 0
#elif defined(__GNUC__) && !defined(USE_HAL_DRIVER)//标准库情况下
#define GetTime() 0
#elif defined(USE_HAL_DRIVER)//hal库情况下
#define GetTime() HAL_GetTick() //视情况而定,默认设置为滴答定时器计时
#else
#endif
#endif