#define XXX do{ XXX } while(0) 为什么会有这种用法
来源:互联网 发布:数据分析实验室 编辑:程序博客网 时间:2024/05/21 07:12
#define XXX do{ XXX } while(0) 为什么会有这种用法
时常会遇到一个很"奇怪的宏定义", rt.(欧西巴...思考不够深刻啊, 皮鞭, 啪啪啪)
最近又遇到这家伙了,Quora上面Love神回答了这个问题, 我也就顶礼膜拜
http://www.quora.com/What-is-the-purpose-of-using-do-while-0-in-macros
这是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.
0 0
- #define XXX do{ XXX } while(0) 为什么会有这种用法
- #define XXX do{...}while(0)
- #define XXX do{...}while(0)
- define do{} while(0) 用法妙用
- #define XXX(...) 这种形式多参宏预处理之后的样子
- #define do{}while(0)妙用
- 强大的 #define XXX / #include XXX / #undef 用法
- 为何会有 do {} while (0) 的写法?
- do {} while (0) 用法
- do while(0) 用法
- do...while(0)用法
- do{}while(0)用法
- do{}while(0)用法
- define中为何经常会使用 do{ } while(0);来包装多条语句代码
- 为什么使用do{...} while(0) ?
- 为什么使用do{}while(0)?
- 什么情况下用宏定义do{}while(0);这种结构
- 什么情况下用宏定义do{}while(0);这种结构
- 编码实践五要诀
- C++学习之【使用位操作符求素数分析】
- MINA源码简易剖析(一)
- Java学习之-动态编译-DynamicCompile_反射调用
- ios开发-OC的初步学习
- #define XXX do{ XXX } while(0) 为什么会有这种用法
- android IntentService生命周期问题
- 就这么开始吧
- 设计模式之策略模式——角色游戏
- SQL 行列倒置
- CLUVFY工具
- 新功能:Azure 负载平衡器的空闲超时现可配置了
- 花生壳&IIS发布网站-----花生壳绑定自己电脑IP问题
- 很酷的 C 语言技巧