当我检查Linux内核中container_of
宏的定义时,
我看到一个复合语句作为宏定义,
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
然而,在我看来,不清楚的问题是哪个陈述被考虑为右值。
显然,最后一个语句的结果用作右值,但为什么呢?
(type *)( (char *)__mptr - offsetof(type,member) );
例如,下面的代码示例是否合法?
int g_count = 0xFF;
#define GLOBAL_COUNT do {g_count;} while(0)
int main(int argc, char *argv[])
{
int local;
local = GLOBAL_COUNT;
local = 0;
GLOBAL_COUNT = local;
return 0;
}
复合语句中变量的赋值规则是什么?
答案 0 :(得分:8)
({})
是C的GNU扩展,称为语句表达式:
http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
在C中,复合语句是一个语句,语句不能在表达式中使用。
答案 1 :(得分:4)
您看到的是语句表达式,而不是复合语句。 语句表达式是标准C语言中不存在的GCC扩展名。
在GCC中语句表达式“按值”返回结果,这意味着它们的结果是rvalues。这实际上与C语言的一般“哲学”一致:在C中,几乎任何对左值对象的操作都会使它们迅速失去左值并变成右值。 (在这方面,C几乎与C ++相反.C ++试图尽可能长时间地保留左值。)