条件编译 #if 预处理器

1.条件编译中使用的预编译指令

#define            定义一个预处理宏
#undef            取消宏的定义

#if                   编译预处理中的条件命令,相当于C语法中的if语句
#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef            与#ifdef相反,判断某个宏是否未被定义
#elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
defined          与#if, #elif配合使用,判断某个宏是否被定义、

#error          当遇到标准错误时,输出错误消息
#pragma         使用标准化方法,向编译器发布特殊的命令到编译器中

预定义的宏

DATE	当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
TIME	当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
FILE	这会包含当前文件名,一个字符串常量。
LINE	这会包含当前行号,一个十进制常量。
STDC	当编译器以 ANSI 标准编译时,则定义为 1

使用方法 1.

可以防止头文件被多次使用,以及调用
这里我们设置的头文件的名字是 bsp_usart.h

#ifndef __BSP_USART_H
#define __BSP_USART_H

#endif /* __BSP_USART_H*/

使用方法 2.

在代码处或者 宏定义处 使用条件编译 选定某一段代码执行,或者选定某一段宏定义执行,提高文件的可移植性

这里我们以定时器为例子

//首先定义几个宏定义用于条件编译的判断
//当我们使用定时器2的时候就让该宏定义置1 
#define GENERAL_TIM2    1
#define GENERAL_TIM3    0
#define GENERAL_TIM4    0
#define GENERAL_TIM5    0
//定时器2的宏
#if GENERAL_TIM2
#define GENERAL_TIM    TIM2
//定时器3的宏
#elif GENERAL_TIM3    
#define GENERAL_TIM    TIM3
//定时器4的宏
#elif GENERAL_TIM4
#define GENERAL_TIM    TIM4
//定时器5的宏
#elif GENERAL_TIM5
#define GENERAL_TIM    TIM4
#endif 
//使用endif结尾
#else只能出现在最后 他的后面必须是#endif
#if 1
  printf("hello world\n");
#else 
  printf("no\n");
#endif 

ifdef 的使用

#define dd 0/1
  #ifdef dd
      逻辑1
  #else
      逻辑2
  #endif

#ifdef只关心宏是否被定义,不关心宏逻辑的真假
举例:#define 宏 1 和 #define 宏 0 等效,都等同于 #define 宏

undef的使用

#undef  FILE_SIZE
#define FILE_SIZE 42

这个指令告诉 CPP 取消已定义的 FILE_SIZE,并定义它为 42

预定义的宏例子

#include <stdio.h>
 
int main()
{
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ ); //当前的行号
   printf("ANSI :%d\n", __STDC__ ); 
   return 0;
}

输出结果
在这里插入图片描述

宏延续运算符 ()

一个宏通常写在一行中,但是如果一个宏的长度过于长,单行容不下,就可以使用宏延续运算符

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

字符串常量化运算符(#)

#include <stdio.h>
 
#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")
 
int main(void)
{
   message_for(Carole, Debra);
   return 0;
}

在这里插入图片描述

标记粘贴运算符(##)

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:

#include <stdio.h>
#define tokenpaster(n) printf("token" #n " =%d\n",token##n)

int main(void)
{
   int token34 = 40;
 
   tokenpaster(34);
   return 0;
}

在这里插入图片描述

参数化宏

#define square(x) ((x)*(x))
#define MAX(x,y) ((x) > (y) ? (x) : (y)) 比较大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值