宏制造Bug

宏 if

  • 原理:多行代码可以缩成一行宏定义,坏习惯--单行if不加大括号

     // 定义一个宏INIT_MAIN,实际是两个函数check_ping和start_nginx,而且没有括号
     #define INIT_MAIN  check_ping(); start_nginx(); 
     if(flag)  // 不加大括号的坏习惯
       INIT_MAIN;
    

    如上,会导致无论如何都执行start_nginx函数

  • 解决方法:加上do { } while(0);

     #define INIT_MAIN  do { check_ping(); start_nginx(); } while(0);
    

宏 条件语句

  • 原理:宏替换,!号的优先级大于==
     #define ASSERT(x) do { \
      if(!x) { .... }       \
     } while(0)             \
    
    如果执行ASSERT(2==2)会被展开为 if((!2)==2),很明显不对吧
posted @ 2023-06-06 15:46  马角的逆袭  阅读(6)  评论(0编辑  收藏  举报