1、 #if (AAA && !BBB && !(defined(CCC)))
#error "------1-----"
#endif注:如果AAA的宏值为非0值,BBB的宏值为0值 且 define 了CCC宏(CCC不论是空宏还是任意数值的宏,这里的作用都等效),那么就会输出错误打印-----1-----
#define __Vendor_SysTickConfig 0
#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
xxx //这部分会起效
#endif
2、#define AAAA(message, assertion) do { if (!(assertion)) { printf(message); } } while(0)
注:宏中使用 do while(0) 时,定义处的结尾不能有分号;使用宏的地方以分号结尾。 在使用 \ 多行显示时,while(0) 后不需要 \
3、 根据宏定义实现不变更api的情况下实现函数体不同的操作。 (另一种方式是在函数体内用宏分段区分)
#ifdef AAAA
void stats_init(void); //注意这里有分号
#else
#define stats_init() //注意这里没分号
#endif
如此,则不论宏AAAA的定义情况,均可以使用 stats_init();
4、 #ifdef 和 #if 的区别
#ifdef 只要求宏名被 #define 过即可,其有无数值和数值的值均无所谓; 而 #if 则要求宏名既要被 #define 过,且必须被 #define 为非零值(逻辑真值)。举例:
#ifdef AAAA
#if BBBB
printf(“---------------1---------------”) //#define AAAA 且 #define BBBB 为非0值时,才会打印
#endif
#endif
5、 do…while(0) 可以代替 goto 关键字的作用