【问题标题】:macro: does #define a(b) ({... c;}) means a(b) returns c?宏:#define a(b) ({... c;}) 是否意味着 a(b) 返回 c?
【发布时间】: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


【解决方案1】:

正确。它将返回___val。但是,像这样的块表达式是 GNU 扩展,实际上并不是 C 标准的一部分。

http://www.toofishes.net/blog/gcc-compound-statement-expressions/

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2015-08-26
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多