C语言中宏定义(#define)时do{}while(0)的价值
2015-12-28 17:00
537 查看
最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在:
1. 增加代码的适应性
下面的宏定义没有使用do{...}while(0)
这样宏定义,单独调用不会出现问题,例如:
宏扩展后变成:
这样调用FOO没有任何问题,但是FOO(x)不能放入控制语句中,例如
经过宏扩展后,变成了
这样就导致了语法错误,语法错误并不可怕,在编译阶段就能发现,更致命的是他有可能导致逻辑错误,这种错误编译器发现不了,一出这种问题,程序员就抓狂吧。例如:
这段代码经过扩展后变成:
这样一来,无论condition是true还是false,bar(x)都会被调用。有没有被这煎熬过的兄弟啊?
这时候do{...}while(0)的价值就体现出来了,修改一下FOO的定义
这样FOO,放入控制语句中就没有问题了。
也许有人说:把foo(x);bar(x)用大括号括起来不就行了吗?比如这样定义:
再看下面代码:
扩展后:
照样语法错误;
2.增加代码的扩展性
我理解的扩展性,主要是宏定义中还可以引用其他宏,比如:
3.增加代码的灵活性
灵活性主要体现在,我们可以从宏中break出来,例如下面的定义:
1. 增加代码的适应性
下面的宏定义没有使用do{...}while(0)
#define FOO(x) foo(x); bar(x);
这样宏定义,单独调用不会出现问题,例如:
FOO(100)
宏扩展后变成:
foo(x);bar(x);
这样调用FOO没有任何问题,但是FOO(x)不能放入控制语句中,例如
if (condition) FOO(x); else ...;
经过宏扩展后,变成了
if (condition)
foo(x);bar(x);else
...;
这样就导致了语法错误,语法错误并不可怕,在编译阶段就能发现,更致命的是他有可能导致逻辑错误,这种错误编译器发现不了,一出这种问题,程序员就抓狂吧。例如:
if (condition) FOO(x);
这段代码经过扩展后变成:
if (condition) foo(x); bar(x);
这样一来,无论condition是true还是false,bar(x)都会被调用。有没有被这煎熬过的兄弟啊?
这时候do{...}while(0)的价值就体现出来了,修改一下FOO的定义
#define FOO(x) do { foo(x); bar(x); } while (0)
这样FOO,放入控制语句中就没有问题了。
也许有人说:把foo(x);bar(x)用大括号括起来不就行了吗?比如这样定义:
#define FOO(x) { foo(x); bar(x); }
再看下面代码:
if (condition) FOO(x);
else
...;
扩展后:
if (condition) {foo(x);bar(x);} ; //注意最后这个分号,语法错误 else ...;
照样语法错误;
2.增加代码的扩展性
我理解的扩展性,主要是宏定义中还可以引用其他宏,比如:
#define FOO(x) do{OTHER_FOO(x)} while(0)
这样我们不用管OTHER_FOO是但语句还是符合语句,都不会出现问题
3.增加代码的灵活性
灵活性主要体现在,我们可以从宏中break出来,例如下面的定义:
#define FOO(x) do{ \ foo(x); \ if(condition(x)) \ break; \ bar(x) \ ..... \ } while(0)
相关文章推荐
- c++11 静态成员线程安全?
- 高质量C++编程之第3章 命名规则
- C++11多线程(三):std:mutex
- C/Cpp指针
- Python调用C/C++动态链接库的方法
- TsinghuaX: 00740043X C++语言程序设计基础 第五章提纲
- C++学习:字符串分割函数
- TsinghuaX: 00740043X C++语言程序设计基础 第四章提纲
- TsinghuaX: 00740043X C++语言程序设计基础 第三章提纲
- TsinghuaX: 00740043X C++语言程序设计基础 第二章提纲
- 高质量C++编程之第1章 文件结构
- 取字符串的长度strlen()函数
- C++11杂记
- TsinghuaX: 00740043X C++语言程序设计基础 第一章提纲
- 一个简单的C++程序及说明
- C语言中的位域、字节序、比特序、大小端
- 【转载】C++中的基类与派生类
- Problem A: C语言习题5.9--整数n和m之间的素数个数
- C++ Virtual
- C++入门(5):定义个人函数