无法理解语句 (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;
在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
,因此如果不是,编译器会报错。
请参阅
所以在 ({ int x = c; x; })
中,表达式的值被计算为 x;