1、#define 是宏定义
1.1宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。
1.2如 define int MAX;
那么你在写程序时:MAX i; 就和int i; 完全一样;因为编译预处理器会把所有的MAX替换成int。优点:有利于程序阅读和修改,自己可以仔细体会。
2、#ifdef 一看意思就是个条件判断语句。等于 #if define( 标识符1)
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的功能是,如果标识符已被#define 命令定义过则对程序段1 进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else 可以没有,即可以写为:
#ifdef 标识符
程序段
#endif
第二种形式:
#ifndef 标识符
程序段1
#else
程序段2
#endif
与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define 命令定义过则对程序段1 进行编译,否则对程序段2 进行编译。这与第一种形式的功能正相反。
第三种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2 进行编译。因此可以使程序在不同条件下,完成不同的功能。
至于#elif 命令意义与else if 相同,它形成一个if else-if 阶梯状语句,可进行多种编译选择。
#ifdef DEBUG
是判断 DEBUG头文件是否已经存在,ifdef(if define)
存在就执行
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(u8* file, u32 line);
返回失败并找到在哪里定义了,
否则执行
#define assert_param(expr) ((void)0)
这些是预编译开关的使用
#ifdef YOUR_FLAG
/*part1*/
#else
/*part2*/
#endif
根据YOUR_FLAG的是否已经宏定义,来执行不同的设置。如果已经定义了YOUR_FLAG,则使用并编译part1部分,否则使用part2部分。
像你这里,要使用实际有功能的使用assert_param,则需要在在这个头文件之前加上:
#define DEBUG
然后还需要自己编写void assert_failed(u8* file, u32 line);的定义体。
如果不需要使用实际意义的assert_param,则不需要使用#define DEBUG,如果其他地方有了这个宏定义,你也得删掉或注释掉。
一般的,
if(condition) do_something1;
else do_something2;
这些是编译过程中会把程序转换成汇编语句和二进制执行语句。
而#ifdef FLAG
#else
#endif
是在编译之前的预编译阶段完成的(可能有些编译器没预编译的功能,那就在编译阶段完成)。