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)) 比较大小