C语言-define 与do{}while(0)
2024-09-04 13:50:33
问题引出:
我们都知道宏定义#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中包含相应的头文件否则容易出错
最新文章
- blade and soul zone overview
- 一些Layout的坑
- python socket
- javacsript Numnber 对象
- C语言输出字符串
- Entity Framwork(EF) 7——在现在数据库的甚而上开发MVC 新项目
- ssh连接失败解决方法
- android使用广播退出应用程序
- JAVA简单的SWING及AWT
- fcntl记录锁
- 【Linux驱动】TQ2440 LED驱动程序
- Spring的后置处理器BeanPostProcessor
- 集群增量会话管理器——DeltaManager
- 我学Java我傲娇
- 03 JVM 从入门到实战 | 简述垃圾回收算法
- SmartCode.ETL 这不是先有鸡还是蛋的问题!
- VS工具箱中添加DevExpress控件
- 【全文转载】Gradle、Maven项目相互转换
- html-div+span-4
- Memcached在SpringMVC上的使用
热门文章
- Unity相机鼠标基本控制
- nmon help文档zh-han
- .NTE Core Web API Example
- Python爬虫连载7-cookie的保存与读取、SSL讲解
- Abp.Core运行时提示XX没有实现,或者没有依赖注入的问题,或者调试时提示做出更改的问题
- CentOS7服务器状态下安装xampp
- Go非缓冲/缓冲/双向/单向通道
- html - html5 audio 音乐自动播放,循环播放等
- matplotlib动态图subplots()和subplot()不同及参数
- Hybrid App 开发快速指南