无法理解语句 (void)(x == y) and 1;在 linux 类型检查宏中

Can't understand statement (void)(x == y) and 1; in linux typecheck macro

在linux5.4.21源代码include/linux/irqflags.h,

#define raw_local_save_flags(flags)         \
    do {                        \
        typecheck(unsigned long, flags);    \
        flags = arch_local_save_flags();    \
    } while (0)

并在 include/linux/typecheck.h

#define typecheck(type,x) \
({  type __dummy; \
    typeof(x) __dummy2; \
    (void)(&__dummy == &__dummy2); \
    1; \
})

我不明白类型检查宏是如何工作的。因此类型检查宏使变量 __dummy 具有类型 type,而另一个变量 __dummy2 具有与 x 相同的类型。然后比较这两个变量的地址。我想放置 (void) 会使比较语句不会出错。但是这个比较有什么作用?两个变量如何具有相同的地址?最后的状态是什么 1; ?而这个宏在raw_local_save_flags宏中有什么作用呢? (与它的名字有关..)有人可以给我解释一下吗?谢谢!

仅当对象属于同一类型时才允许比较 &__dummy == &__dummy2,因此如果不是,编译器会报错。

请参阅 关于复合语句。 您可以提供 brace-surrounded 块(复合语句)作为有效表达式,其 值是块中的最后一个表达式。

所以在 ({ int x = c; x; }) 中,表达式的值被计算为 x;