下面的代码中for(pos=hlist_bl_first_rcu(head);pos&&({tpos=hlist_bl_entry(pos,typeof(*tpos),member);1;});pos=rcu_dereference_raw(pos->next)){...}第3行({tpos=hlist\_bl\_entry(pos,typeof(\*tpos),member);1;})的意思是执行函数hlist\_bl\_entry()后再将这个括号的值设置为1,就是这个for循环只通过pos的值来判断是否继续执行。现在不太清楚这一行的语法,为什么可以这么写,求解释。
2 回答
皈依舞
TA贡献1851条经验 获得超3个赞
之前也没见到过这样的特殊用法,刚才搜了一下,找到了有关的描述。({exp1;exp2;exp3;})这样的用法是复合语句的表达式用法,其值等于exp3的值。如果exp3不能求值,得到的结果就是void。({inta=2+1;intb=0;b;})//0({inta=2+1;intb=0;intc=0;})//void我相信GNUC当中有更多标准化的描述,你也可以自己寻找。
梦里花落0921
TA贡献1772条经验 获得超6个赞
好吧,我替你找到出处了:linux源码。/***hlist_bl_for_each_entry_rcu-iterateoverrculistofgiventype*@tpos:thetype*touseasaloopcursor.*@pos:the&structhlist_bl_nodetouseasaloopcursor.*@head:theheadforyourlist.*@member:thenameofthehlist_bl_nodewithinthestruct.**/#definehlist_bl_for_each_entry_rcu(tpos,pos,head,member)\for(pos=hlist_bl_first_rcu(head);\pos&&\({tpos=hlist_bl_entry(pos,typeof(*tpos),member);1;});\pos=rcu_dereference_raw(pos->next))#endif这是hlist_bl_for_each_entry_rcu的定义。我们在对比一下list_for_each_entry_rcu的定义:/***list_for_each_entry_rcu-iterateoverrculistofgiventype*@pos:thetype*touseasaloopcounter.*@head:theheadforyourlist.*@member:thenameofthelist_structwithinthestruct.**Thislist-traversalprimitivemaysafelyrunconcurrentlywith*the_rculist-mutationprimitivessuchaslist_add_rcu()*aslongasthetraversalisguardedbyrcu_read_lock().*/#definelist_for_each_entry_rcu(pos,head,member)\for(pos=list_entry((head)->next,typeof(*pos),member);\prefetch(rcu_dereference(pos)->member.next),\&pos->member!=(head);\pos=list_entry(pos->member.next,typeof(*pos),member))pos&&是短路求值,可以检查是否为空NULL,此时返回1,可以防止提前结束。
添加回答
举报
0/150
提交
取消