为了账号安全,请及时绑定邮箱和手机立即绑定

对一行C代码的语法不明白,求解释

对一行C代码的语法不明白,求解释

泛舟湖上清波郎朗 2019-04-09 20:23:26
下面的代码中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当中有更多标准化的描述,你也可以自己寻找。
                            
查看完整回答
反对 回复 2019-04-09
?
梦里花落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,可以防止提前结束。
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 361 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信