我阅读了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语句对我来说非常奇怪。这是我第一次看到这种说法。它应该如何运作?
答案 0 :(得分:7)
这意味着始终生成0
,但也会评估d
,以防它出现像p++
这样的副作用。
至于为什么你想要总是产生0
:the 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)
评估左侧成员(在您的情况下为d
)的副作用,然后丢弃。正确的成员(0
)给出了结果。