C 语言静态断言简介

本文内容

目录汇总:C 语言零基础入门教程

函数 assert 在程序运行期间做诊断工作,从 C11 开始引入的静态断言 _Static_assert 可以把检查和诊断工作放在程序编译期间进行。

1
[静态断言] _Static_assert(常量表达式, 字面串);

在这里,_Static_assert 是 C11 新增的关键字。“常量表达式”必须是一个整型常量表达式。如果它的值不为 0,则没有什么效果;如果值为 0,则违反约束条件,并且 C 实现应当产生一条诊断信息,在这条信息里应当包含“字面串”的内容,除非字面串的内容不是用基本源字符集 1 编码的。

C 标准规定 unsigned int 类型可表示的数值范围至少是-32 767~32 767,当然绝大多数平台支持比这个规定大得多的范围。为了保险起见,下面这个小程序要求 unsigned int 能够表示超出上述范围的数值,所以用静态断言来决定是否允许继续编译。

1
2
3
4
5
6
7
8
# include <limits.h>

int main(void)
{
    _Static_assert(UINT_MAX >= 32767, "Not support this platform.");
    // 其他代码
  return 0;
}

如果 unsigned int 的最大值大于 32 767,那么这个常量表达式的值为 1,这个静态断言什么也不做;否则编译不能继续进行,并显示第 5 行出现错误,错误的原因是静态断言失败。在 C11 中,静态断言是作为声明出现的。

在引入静态断言之前,我们通常是在预处理阶段用 #if#error 等预处理指令做一些诊断工作,但是预处理器并不认识 C 的语法元素,这就限制了它的功能和应用范围,而引入静态断言则可以解决这个问题。

请参阅

(完)


  1. C 语言使用的字符集包括基本源字符集和扩展字符集,前者包括 26 个(大小写)英文字母、数字以及标点符号等;后者由你所在地区的文字符号组成。 ↩︎

comments powered by Disqus

本文内容