博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C 语言宏定义中使用do...while(0)
阅读量:6637 次
发布时间:2019-06-25

本文共 1189 字,大约阅读时间需要 3 分钟。

 最近看到C语言的项目中在宏定义中使用了do...while(0),感到是个知识点,特来总结。

 先看这句话:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果。这句话的意思是说,在宏定义中使用do...while(0)包含的所有语句是一个代码块,不会受到{};的影响。

看一个例子:

#include 
#include
#define TEST(p) \ do \ { \ if(p!=NULL) \ { \ free(p); \ printf("free success!\n"); \ } \ p=NULL; \ }while(0)int main(){ int *p=NULL; p=(int*)malloc(sizeof(int)); TEST(p); printf("---------done!---------\n"); return 0;}

  \的作用是这一行的语句没有完,下一行内容是跟上一行联在一起的。

 

 

再来看一个出错的例子:

宏定义:  #define foo(x) bar(x); baz(x)

然后调用:       foo(x);  这样根据宏替换的原则就是:  bar(x);baz(x);          这是正确的!

但是如果这样:     if()

          foo(x)

就会被替换成:    if()

          bar(x);

        baz(x);              这显然是和我们希望执行的是不一样的!

 

 

 

为什么不用大括号直接把宏包围起来呢?为什么非得使用do/while(0)逻辑呢?

按照上面的例子:

if ()

{

    
bar(wolf);
    
baz(wolf);
};     //最后会添加;,在语法上是错误的!

转载于:https://www.cnblogs.com/scf141592/p/7513943.html

你可能感兴趣的文章
ubuntu 终端乱码问题解决方案
查看>>
为什么匿名内部类参数必须为final类型
查看>>
邮件服务器邮件群发实用技巧
查看>>
使用JMeterPlugins监控CPU内存等(七)
查看>>
赛门铁克SF双活软件使用经验浅谈
查看>>
我的友情链接
查看>>
SQLSERVER拯救某个时间点被误删除的数据
查看>>
mysql索引创建
查看>>
Button的快速点击之My idea
查看>>
Intent(意图)
查看>>
斐波那契算法--------php
查看>>
datagridview 选中与取消选中
查看>>
第三届云计算大会 - Dell云计算: 企业的有效转型策略(转载)
查看>>
在Hyper-V、Virtual PC等虚拟机中使用USB设备的方法
查看>>
送给前线码农的话 - 大牛们的经典语录
查看>>
JavaScript模式 读书笔记二
查看>>
解决solr死锁问题
查看>>
Java语法错误之-执行不到的代码(Unreachable code)
查看>>
Javascript学习笔记-01
查看>>
recent
查看>>