内核代码宏中 do{...}while(0) 的作用
2016-10-09 16:51
381 查看
在内核空间非常有限的情况下,为什么还要在某些宏里增加 do{...}while(0) 这种“没用”的代码行呢?
带参数的宏定义的一般形式为:
#define <宏名>(<参数表>) <宏体>
<宏名>:一个标识符
<参数表>:参数可以是一个或多个。多个参数之间用逗号分隔
<宏体>:被替换用的字符串,字符串是由参数表中的各个参数组成的一个或多个表达式
*宏体在调用处直接展开
eg:#define N 2+3
int main ()
{
int n;
n = N*2;
printf ("%d", n);
return 0;
}
答案为8 (2+3*2=8)
假设有这样一个宏定义:
#define exch(x,y) int tmp; tmp=x; x=y; y=tmp;
当我们这样用的时候:
if (x > y)
exch(x,y);
else
do_something();
根据宏的用法,可得:
if (x > y)
int
tmp;
tmp = x;
x = y;
y = tmp;
; // empty statement
else
do_something();
此时,语句tem = x; x = y; y = tmp;明显不在if代码块内。
如果直接在宏定义处加上{},即:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
那确实是解决了上面的问题,可是还会出现新的问题:
if (x > y)
{
int
tmp;
tmp
= x;
x
= y;
y = tmp;
}; // empty statement
else
do_something();
error: ‘else’ without a previous ‘if’
else 前面的 ;表明之前已经是一个(段)完整的语句了,那么接下来直接用 else 就有语法错误了
但是用上 do{...}while(0) 之后:
if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();
为了尽量避免错误,使用do{….}while(0) 把代码块包裹起来,成为一个独立的语法单元,从而不会与上下文发生混 淆。绝大多数的编译器都能够识别do{…}while(0)并进行优化,所以使用这种方法也不会导致程序的性能降低。
带参数的宏定义的一般形式为:
#define <宏名>(<参数表>) <宏体>
<宏名>:一个标识符
<参数表>:参数可以是一个或多个。多个参数之间用逗号分隔
<宏体>:被替换用的字符串,字符串是由参数表中的各个参数组成的一个或多个表达式
*宏体在调用处直接展开
eg:#define N 2+3
int main ()
{
int n;
n = N*2;
printf ("%d", n);
return 0;
}
答案为8 (2+3*2=8)
假设有这样一个宏定义:
#define exch(x,y) int tmp; tmp=x; x=y; y=tmp;
当我们这样用的时候:
if (x > y)
exch(x,y);
else
do_something();
根据宏的用法,可得:
if (x > y)
int
tmp;
tmp = x;
x = y;
y = tmp;
; // empty statement
else
do_something();
此时,语句tem = x; x = y; y = tmp;明显不在if代码块内。
如果直接在宏定义处加上{},即:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
那确实是解决了上面的问题,可是还会出现新的问题:
if (x > y)
{
int
tmp;
tmp
= x;
x
= y;
y = tmp;
}; // empty statement
else
do_something();
error: ‘else’ without a previous ‘if’
else 前面的 ;表明之前已经是一个(段)完整的语句了,那么接下来直接用 else 就有语法错误了
但是用上 do{...}while(0) 之后:
if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();
为了尽量避免错误,使用do{….}while(0) 把代码块包裹起来,成为一个独立的语法单元,从而不会与上下文发生混 淆。绝大多数的编译器都能够识别do{…}while(0)并进行优化,所以使用这种方法也不会导致程序的性能降低。
相关文章推荐
- 内核代码宏中 do{...}while(0) 的作用以及宏中#和##的作用及典型应用
- 关于宏中使用do{}while(0)的作用
- 关于do{}while()的代码讨论
- 关于do...while(0)在宏中的应用
- do&nbsp;while(0)作用
- do {...} while (0) 在宏定义中的作用
- do{.....}while(0)的一些作用
- do{ }while(0) 的宏的作用!
- 32位汇编语言学习笔记(8)--分析do-while循环的汇编代码
- do...while(0)的作用
- 内核里的do{}while(0)
- do...while(0)的作用(FAQ/DoWhile0)
- 宏定义中do{}while(0) 的作用
- 为什么在宏中使用do{...}while(0)结构
- 宏定义中Do{...}while(0)的作用
- define中为何经常会使用 do{ } while(0);来包装多条语句代码
- 关于一段while(1)改为do{}while(...);代码
- 了解Oracle内核代码层的作用
- do{}while(0)在宏定义中的作用
- do {...} while (0) 在宏定义中的作用