1*ff90af6cSMasahiro Yamada #ifndef TYPECHECK_H_INCLUDED 2*ff90af6cSMasahiro Yamada #define TYPECHECK_H_INCLUDED 3*ff90af6cSMasahiro Yamada 4*ff90af6cSMasahiro Yamada /* 5*ff90af6cSMasahiro Yamada * Check at compile time that something is of a particular type. 6*ff90af6cSMasahiro Yamada * Always evaluates to 1 so you may use it easily in comparisons. 7*ff90af6cSMasahiro Yamada */ 8*ff90af6cSMasahiro Yamada #define typecheck(type,x) \ 9*ff90af6cSMasahiro Yamada ({ type __dummy; \ 10*ff90af6cSMasahiro Yamada typeof(x) __dummy2; \ 11*ff90af6cSMasahiro Yamada (void)(&__dummy == &__dummy2); \ 12*ff90af6cSMasahiro Yamada 1; \ 13*ff90af6cSMasahiro Yamada }) 14*ff90af6cSMasahiro Yamada 15*ff90af6cSMasahiro Yamada /* 16*ff90af6cSMasahiro Yamada * Check at compile time that 'function' is a certain type, or is a pointer 17*ff90af6cSMasahiro Yamada * to that type (needs to use typedef for the function type.) 18*ff90af6cSMasahiro Yamada */ 19*ff90af6cSMasahiro Yamada #define typecheck_fn(type,function) \ 20*ff90af6cSMasahiro Yamada ({ typeof(type) __tmp = function; \ 21*ff90af6cSMasahiro Yamada (void)__tmp; \ 22*ff90af6cSMasahiro Yamada }) 23*ff90af6cSMasahiro Yamada 24*ff90af6cSMasahiro Yamada #endif /* TYPECHECK_H_INCLUDED */ 25