我在Linux中遇到了以下代码(包括/Linux/list.h)。我对713行有点困惑。特别是,我不理解({n = pos->member.next;1;})。
花括号在做什么?为什么这个表述中有一个"1"?
如果有人能解释一下这一行,我将不胜感激。注意,我不需要解释链接列表和#define是如何工作的,等等。
704 /**
705 * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
706 * @pos: the type * to use as a loop cursor.
707 * @n: another &struct hlist_node to use as temporary storage
708 * @head: the head for your list.
709 * @member: the name of the hlist_node within the struct.
710 */
711 #define hlist_for_each_entry_safe(pos, n, head, member)
712 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);
713 pos && ({ n = pos->member.next; 1; });
714 pos = hlist_entry_safe(n, typeof(*pos), member))
715
这是一个语句表达式。它是一个gcc扩展,根据文档6.1表达式中的语句和声明:
在这种情况下,对于代码:复合语句的最后一项应该是一个表达式后面跟一个分号;此子表达式的值用作整个构造的值。
({ n = pos->member.next; 1; })
则值为1
。根据文档:
此特性在使宏定义"安全"(以便它们只计算每个操作数一次)时特别有用。
给出了不使用语句表达式的例子:
#define max(a,b) ((a) > (b) ? (a) : (b))
与安全的版本相比,需要注意的是您知道操作数的类型:
#define maxint(a,b)
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
这是Linux内核中使用的众多gcc扩展之一
这是一个GNU语言扩展,称为语句表达式;