The file include/linux/typecheck.h of the Linux kernel 4.16 contains this code.
#define typecheck(type,x) \\
({ type __dummy; \\
ty
This uses two GCC extensions — expression statements ({ ... }) and typeof().
type.x.-Werror).1) is the value of the expression — equivalent to true.So, you get a compilation warning/error if the type of x is not the same as the named type.
Example code:
#include
#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
int main(void)
{
int x;
if (typecheck(int, x))
printf("int x OK\n");
if (typecheck(double, x))
printf("double x OK\n");
return(0);
}
Compilation message:
$ /usr/bin/gcc -O3 -g -std=gnu99 -Wall -Wextra xx.c -o xx
xx.c: In function ‘main’:
xx.c:15: warning: comparison of distinct pointer types lacks a cast
$
Note that because I did not use -Werror, the code compiled 'OK'. The output was:
int x OK
double x OK