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

【C语言标准库:assert】学了这么多年C真的会用断言吗

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

【C语言标准库:assert】学了这么多年C真的会用断言吗

文章目录
      • 经典断言
      • C11静态断言

经典断言

感觉现在很多人都不用assert了,毕竟IDE都这么智能。assert的功能也非常简单,如果输入一个0(False),那么就会打印一条错误信息。

#include
#include

int main(){
	assert(1);
	assert(0);
}

这样一个简单的案例,在命令行中通过gcc编译,果然在第6行报错了。

E:documents001101>gcc assert1.c

E:documents001101>a.exe
Assertion failed: 0, file assert1.c, line 6

查看insert.h的源文件,会发现下面几行代码

#undef assert       //取消已有的assert定义
#ifdef NDEBUG
#define assert (test) ((void)0)
#else
#define assert (test) ...
#endif

这说明,当NDEBUG被定义的时候,会将assert自动转化为一个空函数,从而取消断言。

gcc中-D指令可以添加宏代码,则下面的代码并不会报错

E:documents001101>gcc -DNDEBUG assert1.c
E:documents001101>a.exe
C11静态断言

assert的功能非常简单,我们可以用条件语句写一个类似的函数

void assertIf(int i){
    if(!i){
        printf("error");
        abort();            //自stdlib中调用,可终结函数
    }
}

assert的好处是,可以自动返回出错的行数,并且能够通过define NDEBUG将其禁止。

但assert也有不足,即只能在运行时执行。C11推出了一个新的函数_Static_assert,顾名思义为静态断言,可以在编译时执行:

//sa.c
#include
int main(){
	_Static_assert(0);
}

结果为

E:documents001101>gcc sa.c
sa.c: In function 'main':
sa.c:10:2: error: static assertion failed: "ERROR"
  _Static_assert(0,"ERROR");
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429346.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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