我在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))
答案 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内核源代码中肯定有很多它们。)