Yukang's Page

C 语言的 typecheck

2019-08-06

类型保证

强类型的编程语言通常编译器自带一些类型检查,保证代码编译后不会出现类型方面的错误,比如 Rust 之类的甚至做了变量的生命周期检查,以防止内存出错或者未定义行为。常见的变成语言类型如下:

typecheck

但是 C 为弱类型语言,弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。譬如说 C 语言的 int 可以变成 double。 这样的结果是:容易产生 forbidden behaviours。为了解决类似问题,Linux 内核中的这个宏比较有技巧。

#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})

使用的时候可以保证某些变量为特定的类型:

int a;
typecheck(char, a);

这样就会报出一个编译错误: