CatCoding

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);

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

公号同步更新,欢迎关注👻