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 关键字的作用

 

posted on 2023-06-19 13:24  lance9527  阅读(33)  评论(0编辑  收藏  举报