问题引出:

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

#include <stdio.h>

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

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

#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中包含相应的头文件否则容易出错

最新文章

  1. blade and soul zone overview
  2. 一些Layout的坑
  3. python socket
  4. javacsript Numnber 对象
  5. C语言输出字符串
  6. Entity Framwork(EF) 7——在现在数据库的甚而上开发MVC 新项目
  7. ssh连接失败解决方法
  8. android使用广播退出应用程序
  9. JAVA简单的SWING及AWT
  10. fcntl记录锁
  11. 【Linux驱动】TQ2440 LED驱动程序
  12. Spring的后置处理器BeanPostProcessor
  13. 集群增量会话管理器——DeltaManager
  14. 我学Java我傲娇
  15. 03 JVM 从入门到实战 | 简述垃圾回收算法
  16. SmartCode.ETL 这不是先有鸡还是蛋的问题!
  17. VS工具箱中添加DevExpress控件
  18. 【全文转载】Gradle、Maven项目相互转换
  19. html-div+span-4
  20. Memcached在SpringMVC上的使用

热门文章

  1. Unity相机鼠标基本控制
  2. nmon help文档zh-han
  3. .NTE Core Web API Example
  4. Python爬虫连载7-cookie的保存与读取、SSL讲解
  5. Abp.Core运行时提示XX没有实现,或者没有依赖注入的问题,或者调试时提示做出更改的问题
  6. CentOS7服务器状态下安装xampp
  7. Go非缓冲/缓冲/双向/单向通道
  8. html - html5 audio 音乐自动播放,循环播放等
  9. matplotlib动态图subplots()和subplot()不同及参数
  10. Hybrid App 开发快速指南