Linux中的C代码使用大括号的目的(包括/ Linux /list.h)



我在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语言扩展,称为语句表达式;

相关内容

  • 没有找到相关文章

最新更新