深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

17|标准库:断言、错误处理与对齐

可优化运行时性能
示例:printf("The alignment of n is %zu\n", alignof(n));
查看变量对齐方式
示例:alignas(1024) int n;
指定特殊对齐要求
置零前置,及时检测
标准不一致行为
不承诺设置 errno
设置 errno,返回正常或错误值
设置 errno,返回错误表示值
示例:thrd_create(&thread, run, NULL);
每个线程独立的 errno
POSIX、C++、操作系统额外枚举值
三个 C11 标准枚举值
示例:sqrt(-1); fprintf(stderr, "%s\n", strerror(errno));
默认值 0 表示无错误
存放函数执行后状态信息
受 NDEBUG 宏影响
示例:assert(x > 0.0);
防御式编程与契约式编程
运行时条件检查
示例:static_assert(sizeof(int) >= 4, "Integer should have at least 4 bytes length.");
检查环境要求
编译时约束
契约式编程的理解
对齐:自定义数据对齐方式
错误处理:errno 宏及其使用
断言:静态断言与运行时断言
对齐优化
alignof 宏
alignas 宏
使用建议
函数行为分类
线程本地属性
错误类型
errno 宏
运行时断言 (assert)
静态断言 (static_assert)
思考题
总结
自定义数据对齐 (stdalign.h)
错误处理 (errno.h)
断言 (assert.h)
C 标准库 - 断言、错误处理与对齐

该思维导图由 AI 生成,仅供参考

你好,我是于航。
这一讲是这门课中关于 C 标准库的最后一讲。通过前面几讲的学习,相信你已经对 C 标准库提供的相关能力有了一个全面的认识。在此基础上,我们便可以使用这些成熟的接口,来更加方便地构建应用程序。这一讲后,在“ C 工程实战篇”的其他篇目中,我会和你一起讨论语言具体功能之外的性能优化、自动化测试、结构化编译等 C 工程化相关内容,并带你手把手实现一个简单的高性能 HTTP Server。
今天,我们来看一看与 C 标准库相关的最后三个话题:断言、错误处理,以及对齐。
断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供。错误处理则涉及 C 程序如何通过特定方式,判断其运行是否发生错误,以及错误的具体类型,头文件 errno.h 中则定义了与此相关的宏。除此之外,C 语言还具有自定义数据对齐方式的能力,借助 stdalign.h 头文件提供的宏,我们可以轻松地做到这一点。

断言

在计算机编程中,断言是一种可用于判断程序设计或运行是否符合开发者预期的逻辑判断式。与断言相关的编程接口由标准库头文件 assert.h 提供。
在 C 语言中,断言被分为静态断言与运行时断言。其中,静态断言主要用来约束程序在编译时需要满足的一定要求;运行时断言则可以在程序运行过程中,判断一些支持程序正常运行的假设性条件是否满足。我们来看下面这个例子:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C标准库中的断言、错误处理和自定义数据对齐是本文的重点内容。文章首先介绍了断言的静态和运行时两种方式,通过assert.h头文件提供相关接口。静态断言通过static_assert宏在编译时对程序的要求进行限定,而运行时断言则通过assert宏在程序运行时判断支持程序正常运行的假设性条件是否满足。文章还提到了运行时断言受宏常量NDEBUG的影响,可以灵活控制其启用与关闭。其次,文章详细介绍了C语言中的错误处理机制,通过errno.h头文件提供的errno宏来获取程序在调用标准库函数后的状态信息,同时指出了在不同情况下对errno的使用需要注意的问题。最后,文章介绍了C语言中自定义数据对齐的能力,通过stdalign.h头文件提供的宏可以轻松实现。通过具体的代码示例和解释,读者可以全面了解C标准库中断言、错误处理和对齐的相关知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 纳兰容若
    老师 您好 我在cppreference上发现这个例子: assert((2*2==4) && "Yet another way to add assert message"); 老师说的断言失败给开发者发送自定义的错误消息 是这个意思么

    作者回复: 正解!

    2022-04-19
    2
    3
  • zxk
    契约式编程是一种编程风格,类比商业中的服务供应商与客户的,将编程中划分为了服务提供方与服务调用方,两者之间的关系如下: 1. 服务提供方期望服务调用方能够遵循一定的规范进行调用,这是服务调用方应满足服务提供方定下的先验条件 2. 服务提供方退出时需要保证能够返回特定的结果,这是服务提供方承诺服务调用方定下的后验条件 3. 先验条件与后验条件之间的交集,在进入与退出之后都应保持不变 具体到编程来说,就是客户端遵循一定规范调用方法接口,方法内部会对函数做一定程度的检查(通常是断言 + 异常信息,但 C 中是 errno 的间接方式),客户端会期望方法接口具有特定的行为,并返回一个可预测的返回值。 个人浅显理解,不知道对不对。

    作者回复: 讲解的很赞!

    2022-03-14
    2
  • Luke
    一楼那个太妙了。。。我第一反应是自定义自己的assert宏。 没想到errno居然是线程安全的,跟我以前的印象不太一样了,只记得他是全局的,在此更新一下认知。
    2022-09-20归属地:江苏
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部