为什么使用do {...} while(0)macro for one-statment body?

时间:2016-04-28 09:43:58

标签: c macros do-while

我在include/linux/sched.h中看到了这个:

#define __set_task_state(tsk, state_value)              \
    do { (tsk)->state = (state_value); } while (0)

我知道当涉及到身体中的多语句时,应该使用do {...} while (0)。但这只是身体中的一个陈述,是否真的有必要使用do {...} while (0)?如下:

#define __set_task_state(tsk, state_value)              \
    ((tsk)->state = (state_value))

1 个答案:

答案 0 :(得分:1)

当宏的主体是单个语句或表达式(如此处)时,使用do { ... } while(0)技巧不那么引人注目。

并没有多少错误
#define __set_task_state(tsk, state_value)              \
    ((tsk)->state = (state_value))

但是我怀疑我们仍然可以提出这种“更简单”的定义可能会导致问题的情况,这样do / while技巧仍然是有利的。例如,如果你不小心写了

__set_task_state(a, b)
do_something_else;

在do / while情况下,您为丢失的分号获取的错误消息可能不那么令人困惑。 (或者不是。)

通常,类似函数的宏通常是有问题的,建议使用内联函数。我不知道为什么这里没有使用内联函数。 (Linux内核源代码中肯定有很多它们。)