Issue
In linux 5.4.21 source code include/linux/irqflags.h,
#define raw_local_save_flags(flags) \
do { \
typecheck(unsigned long, flags); \
flags = arch_local_save_flags(); \
} while (0)
and in include/linux/typecheck.h
#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
I can't understand how the typecheck macro works. So the typecheck macro makes a variable __dummy having type type
, and another variable __dummy2 with the same type with x
. It then compares the address of those two variables. I guess putting (void)
makes the comparison statement not make error.. but what does this comparison do? How can two variables have same address? and what is the last state 1;
? And what effect does this macro have in the raw_local_save_flags
macro? (related to how it is called..) Can somebody explain it to me please? Thanks!
Solution
The comparison &__dummy == &__dummy2
is only permitted if the objects are of the same type, so a compiler will complain if they are not.
See this post about Compound Statements. You can supply a brace-surrounded block (a compound statement) as a valid expression whose value is the last expression in the block.
So in ({ int x = c; x; })
the value of the expression is evaluated as x;
Answered By - mmixLinus Answer Checked By - Marilyn (WPSolving Volunteer)