栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

如何在编译阶段查错?

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在编译阶段查错?

  昨天中午吃饭的时候,一个朋友突然问了个他遇到的面试题,如何在编译阶段查错?刚刚听到这个问题我在想 不是用什么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 是可以在编译阶段就就可以查出错误。因为在编译时宏展开了 遇到错误,编译器报错。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/892850.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号