zoukankan      html  css  js  c++  java
  • C语言-define 与do{}while(0)

    问题引出:

    我们都知道宏定义#define只是简单替换,所以遇到复杂的带参数宏,必须很小心的为需要的参数加上括号“()”;同样碰到复杂的多条语句替代,虽然加{}可以将其封装成一个整体,但同时又有另一个问题:与语法习惯的冲突。比如:

    #include <stdio.h>

    void print_1(void)
    {
     printf("print_1 ");
    }

    void print_2(void)
    {
     printf("print_2 ");
    }

    #define  printf_value()    
      {     
      print_1();     
      print_2();

      }


    int main( void )
    {
     int i=0;
     if(i==1)
     
     else
      printf("add else word!!!");printf_value();

     return 0;
    }

    上面的经过编译后会报错:if与else不匹配。怎么可能?将宏带入发现“printf_value();”后面确实多了一个分号,从而导致if与else的不匹配。但是去掉又不和c语言的习惯,因为C规定每条语句后面必须加分号。

      所以解决的办法就是用do{}while(0)同样只执行一次,且将其看成一个整体,同时又兼容了C的习惯,一举多得

    二 用define重定义中断向量:在stm32中的中断函数比如串口中断如果你要用define重定义,然后需要将在stm32fnxx_it.c中包含相应的头文件否则容易出错

  • 相关阅读:
    oracle之修改/忘记用户密码
    linux 使用错误总结
    oracle数据库之用户管理
    linux命令使用总结
    linux各种压缩包的压缩和解压方法
    logback将日志写入不同文件夹里
    nginx下配置多个web服务
    OKHttp3学习
    linux 发送 post 请求
    maven 项目下 Maven Dependencies 下列表为空
  • 原文地址:https://www.cnblogs.com/jieruishu/p/3896745.html
Copyright © 2011-2022 走看看