如果c中的条件很奇怪:if(((void)(d),0)){...}

时间:2017-09-25 14:32:00

标签: c

我阅读了Xen源代码并看到了类似这样的内容:

#define is_domain_direct_mapped(d) ((void)(d), 0)
然后在if语句中使用

is_domain_direct_mapped,如下所示(d是指向struct变量的指针):

if( is_domain_direct_mapped(d) ) {...}

所以在编译器用其定义替换is_domain_direct_mapped之后,我们有类似的东西:

if( ((void)(d), 0) ) {...}

以上if语句对我来说非常奇怪。这是我第一次看到这种说法。它应该如何运作?

2 个答案:

答案 0 :(得分:7)

这意味着始终生成0,但也会评估d,以防它出现像p++这样的副作用。

至于为什么你想要总是产生0the implementation is different on ARM

#define is_domain_direct_mapped(d) ((d) == hardware_domain && dom0_11_mapping)

请注意d如何在此处完全评估一次。

从最初作为确认时引入的一些讨论 - Re: [Xen-devel] [PATCH v3 1/3] xen/x86: introduce is_domain_direct_mapped(d) as (0) on x86

  

当我在common / memory.c中实现了这个定义时,Jan告诉我   使用[1]:

#define is_domain_is_direct_mapped(d) ((void)(d), 0)
     

我怀疑你在这里想要同样的东西。

引用Re: [v4] xen/arm: Allow balooning working with 1:1 memory mapping

  

你要确定(即使不太可能需要)   练习)你在两者中只评估一次宏参数   味道,即在这种情况下

#define is_domain_direct_mapped(d) ((void)(d), 0)

答案 1 :(得分:2)

这是comma operator

评估左侧成员(在您的情况下为d)的副作用,然后丢弃。正确的成员(0)给出了结果。