在linux的内核中,我们可以在linux/sched.h
中找到这段代码,当我看到它时,我心中产生了一些疑问:
- 为什么使用define来创建函数?为什么不使用普通的
return-type function-name(par1, par2) {}
样式? do {} while(0)
有什么意义?#define set_special_state(state_value) do { unsigned long flags; raw_spin_lock_irqsave(¤t->pi_lock, flags); current->state = (state_value); raw_spin_unlock_irqrestore(¤t->pi_lock, flags); } while (0) #endif
最佳答案
这不是一个“函数”,而是一个预处理器宏。
有时必须使用宏来完成 C 语言本身不支持的事情(通常是生成代码)。但这看起来不像是其中一种情况,并且可能应该是一个静态内联函数。 Pergaps Git 历史可以解释为什么它是这样的。
do { ... } while (0)
是一种吞掉分号的常用方法,该方法在调用类似 C 函数的宏之后调用。
关于c - Linux 内核定义无处不在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51757034/