当前位置: 技术问答>linux和unix
linux中这样宏定义有什么好处?
来源: 互联网 发布时间:2016-06-23
本文导语: #define A do {a;b;} while(0) 这样定义有什么好处? | 解释: 如果你想在宏中包含多个语句,可能会这样写: #define do_something() do_a(); do_b(); 这样你就可以用 do_somethin() 来执行一系列操作. 但这...
#define A do {a;b;} while(0)
这样定义有什么好处?
这样定义有什么好处?
|
解释:
如果你想在宏中包含多个语句,可能会这样写:
#define do_something()
do_a();
do_b();
这样你就可以用 do_somethin() 来执行一系列操作.
但这样会有个问题: 如果你下面这样用这个宏地话:
if (...)
do_something();
当宏被展开后就变成:
if (...)
do_a();
do_b();
发现问题没? 原代码的目的是想在 if 为真的时候执行 do_a() 和 do_b(), 但现在呢? 只有 do_a() 在条件语句中, do_b() 任何时候都会执行的.
这时你可能会将那个宏改进一下:
#define do_something() {
do_a();
do_b();
}
看样子行了, 是吗? 如果我这个宏是这个样子的呢:
#define do_something() {
if (a)
do_a();
else
do_b();
}
这么使用:
if (...)
do_something();
else {
...
}
宏展开后:
if (...)
{
if (a)
do_a();
else
do_b();
}; else {
}
注意到第二个 else 前边那个分号了吗?
所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉.
综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用.
注: 如果你看过 linux 内核源代码, 这个技巧非常常见
如果你想在宏中包含多个语句,可能会这样写:
#define do_something()
do_a();
do_b();
这样你就可以用 do_somethin() 来执行一系列操作.
但这样会有个问题: 如果你下面这样用这个宏地话:
if (...)
do_something();
当宏被展开后就变成:
if (...)
do_a();
do_b();
发现问题没? 原代码的目的是想在 if 为真的时候执行 do_a() 和 do_b(), 但现在呢? 只有 do_a() 在条件语句中, do_b() 任何时候都会执行的.
这时你可能会将那个宏改进一下:
#define do_something() {
do_a();
do_b();
}
看样子行了, 是吗? 如果我这个宏是这个样子的呢:
#define do_something() {
if (a)
do_a();
else
do_b();
}
这么使用:
if (...)
do_something();
else {
...
}
宏展开后:
if (...)
{
if (a)
do_a();
else
do_b();
}; else {
}
注意到第二个 else 前边那个分号了吗?
所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉.
综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用.
注: 如果你看过 linux 内核源代码, 这个技巧非常常见