【发布时间】:2011-09-30 01:01:24
【问题描述】:
我在 linux 内核中有这段代码:
#define task_cred_xxx(task, xxx)
({
__typeof__(((struct cred *)NULL)->xxx) ___val;
rcu_read_lock();
___val = __task_cred((task))->xxx;
rcu_read_unlock();
___val;
})
我以前从未见过这样定义的宏,这是否意味着这是 task_cred_xxx(task, xxx) 返回___val?
谢谢!
【问题讨论】:
-
另外,
((struct cred *)NULL)->xxx是(我认为)未定义的行为。 -
@ChrisLutz:通常是这样,但由于 linux 内核只针对 gcc,而且 gcc 允许它,所以它被接受了。
-
@Chris Lutz:只要只需要此类表达式的类型或大小,就可以(至少对于 GCC),表达式本身永远不会被评估。看看
<linux/kernel.h>中常用的container_of宏的实现,看看这个技巧的另一个例子。
标签: c linux-kernel