在 Linux 中类型检测的宏实现如下:
/*
* 检查编译时类型
* 表达式为结果恒定为1,方便比较
*/
#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
/*
* 编译时检查函数类型或者是该类型的指针
*/
#define typecheck_fn(type,function) \
({ typeof(type) __tmp = function; \
(void)__tmp; \
})
多语句表达式
在 GUN C 中被圆括号包围起来的混合表达式可以作为一条表达式使用,即形如 ({...})
被当作一条表达式。这种形式方便使用循环或者使用局部变量,尤其方便在宏定义的时候使用。
最后一条语句的值作为整个表达式的返回值。如果这条语句为 void,则表明这个表达式的返回值为 void。
变量类型比较
void(&__dummy == &__dummy2);
在编译时利用两个指针的相等性比较进行检测。GUN C 指出不同类型指针的比较在编译时会输出一条warning:
warning: comparison of distinct pointer types lacks a cast
最后比较结果转换为void,即丢弃这个结果。
函数类型比较
typeof(type) __tmp = function;
在编译时利用赋值语句进行检测。如果类型不一致,则输出一条warning:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
参考: