En el código fuente de Linux 5.4.21 include/linux/irqflags.h,
#define raw_local_save_flags(flags) \ do { \ typecheck(unsigned long, flags); \ flags = arch_local_save_flags(); \ } while (0)y en include/linux/typecheck.h
#define typecheck(type,x) \ ({ type __dummy; \ typeof(x) __dummy2; \ (void)(&__dummy == &__dummy2); \ 1; \ }) No puedo entender cómo funciona la macro de verificación de tipos. Entonces, la macro de verificación de tipo crea una variable __dummy que tiene tipo type , y otra variable __dummy2 con el mismo tipo con x . Luego compara la dirección de esas dos variables. Supongo que poner (void) hace que la declaración de comparación no cometa un error ... pero ¿qué hace esta comparación? ¿Cómo pueden dos variables tener la misma dirección? y cual es el ultimo estado 1; ? ¿Y qué efecto tiene esta macro en la macro raw_local_save_flags ? (relacionado con cómo se llama...) ¿Alguien me lo puede explicar por favor? ¡Gracias!
La comparación &__dummy == &__dummy2 solo está permitida si los objetos son del mismo tipo, por lo que un compilador se quejará si no lo son.
Vea este post sobre Sentencias Compuestas. Puede proporcionar un bloque rodeado de llaves (una declaración compuesta) como una expresión válida cuyo valor es la última expresión del bloque.
Entonces en ({ int x = c; x; }) el valor de la expresión se evalúa como x;