昨天中午吃饭的时候,一个朋友突然问了个他遇到的面试题,如何在编译阶段查错?刚刚听到这个问题我在想 不是用什么printf的调试语句 或者那个assert函数。当想了想这不是在运行时才能发现的吗? 朋友当时也很疑惑,知道今天中午的时候无意间想到宏是在预编译的时候展开 如果用宏去判定不就妥妥的可以嘛。
去查了一下发现内核有两个宏定义 BUILD_BUG_ON 和BUILD_BUG_ON_ZERO可以在编译阶段发现一些代码潜在的错误。
BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])):只有条件condition为0时可编译,但不返回值,否则编译器报错。
BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1):只有条件e为0时返回0,否则编译器报错。
从某种程度上来看,C语言宏可以看作是编译时的 assert()。
既然如此,为什么不直接使用 assert()?
用assert()是一个函数,类似与printf调试语句了 只能在运行时才可以查出 错误 程序运行时出错就麻烦了,至少需要程序员编写相应的错误处理逻辑C语言代码。
而BUILD_BUG_ON 是可以在编译阶段就就可以查出错误。因为在编译时宏展开了 遇到错误,编译器报错。



