博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#define XXX do{ XXX } while(0) 为什么使用
阅读量:6203 次
发布时间:2019-06-21

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

#define XXX do{ XXX } while(0) 为什么使用

时常会遇到一个非常"奇怪的宏定义", rt.(欧西巴...思考不够深刻啊, 皮鞭, 啪啪啪)

近期又遇到这家伙了,Quora上面Love神回答了这个问题, 我也就顶礼膜拜

这是C语言里面宏定义的时候,不会造成歧义或副作用的一种经常使用技巧.

考虑一下情况

#define foo(x)  bar(x); baz(x)


foo(wolf);


常规的,扩展成例如以下代码:


bar(wolf); baz(wolf);


这都还好,没啥问题.可是假设遇到if推断语句了,看看以下的样例.

f (!feral)    foo(wolf);

这就扩展成了以下的形式,(⊙o⊙)看,是不是出现了你不想要粗线的情况捏?

这里if语句仅仅能作用于第一个bar()函数,无法作用于第二个baz().可是这样的方式非常可能不是程序猿的本意.

本意就是把foo单做一个总体嘛~


if (!feral)    bar(wolf); baz(wolf);

等价于例如以下形式
if (!feral)    bar(wolf);baz(wolf);


离开了 
do/while(0)你就别想把宏定义玩的跟函数一样一样的~


假设使用这样的技巧定义宏定义, 


#define foo(x)  do { bar(x); baz(x); } while (0)


还是这个宏定义,这么用

f (!feral)    foo(wolf);

就变成了例如以下形式.

if (!feral)    do { bar(wolf); baz(wolf); } while (0);
等价于
if (!feral) {    bar(wolf);    baz(wolf);}

你可能会想,用以下这样的方式,加个{}不就解决这个问题了么?干嘛害的要do{} while(0)?

考虑例如以下情况

#define foo(x)  { bar(x); baz(x); }

if (!feral)    foo(wolf);else    bin(wolf);
这就变成了
if (!feral) {    bar(wolf);    baz(wolf);};else    bin(wolf);

注意!这里使得else变成了"臭名昭著的"dangling else.

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
读书笔记之:C++参考大全
查看>>
PYDay2-linux基础\常用命令
查看>>
《软件测试自动化之道》读书笔记 之 目录导航
查看>>
语义化标签
查看>>
Java数据类型和MySql数据类型对应表
查看>>
iOS的动态代理模式的实现
查看>>
内存架构
查看>>
用户管理的备份与恢复
查看>>
Linux(CentOS 7)环境下安装MySQL
查看>>
64bit ubuntu 移植 arm-linux-gcc 4.3.2 版本出错
查看>>
对象映射工具AutoMapper介绍
查看>>
括号字符串
查看>>
解决Android调用https服务API时出错的问题
查看>>
MyBatis3学习--来源自用户指南
查看>>
@Select注解的情况下,重载的报错
查看>>
移动距离——第六届蓝桥杯C语言B组(省赛)第八题
查看>>
磁砖样式——第八届蓝桥杯C语言B组(国赛)第二题
查看>>
代码度量工具——SourceMonitor的学习和使用
查看>>
对JavaScript的认识?
查看>>
hdu 1503 Advanced Fruits 最长公共子序列 *
查看>>