编译期断言是一种对编译期能计算出来的常量的值进行断言,从而避免代码中引入一些不合理的值。
实现原理
编译期断言的是利用了编译、链接时,编译器遇到了__error__属性会报错的特性。我们通过编写宏,在编译期检查条件不通过时,extern一个并不会存在的函数,并指定这个函数编译报错的时候要输出的信息。这样的话,一旦编译期检查条件不通过,编译器就会发现我们的代码extern了一个不存在的函数,且具有__error__属性,于是编译器就会报错,停止编译。这就是主要的原理。
当编译期检查通过时,编译器会丢掉那些不被调用的路径的代码。也就是说会丢掉我们上述故意制造的用来抛出错误的代码。
那么,如果编译期断言的condition,并不是编译期能计算出来的,那怎么办呢?由于我们的condition不能在编译期被计算出来,那么,上面的宏就会被编入代码,编译器同样也会遇到__error__属性,因此也会终止编译。
Dragonos中的实现
DragonOS在9b37ff3e这个提交中,加入了编译期断言的代码。
转载请注明来源:https://longjin666.cn/?p=1562
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~