【C++11】static_assert 与assert区别

47 篇文章 10 订阅
20 篇文章 2 订阅
本文详细介绍了C++11中的static_assert与assert的区别。static_assert作为静态断言,提供编译时期的错误检查,具有高效、产生清晰错误信息等优点,适合模板参数检查。而assert则是运行时断言,主要用于调试阶段,对性能有一定影响。此外,还提到了#error预编译期错误检查。文章通过实例展示了static_assert的用法及其在不同作用域的适用性。
摘要由CSDN通过智能技术生成

【C++11】static_assert 与assert区别

背景

assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

assert分为动态断言静态断言2种。c++11引入了static_assert关键字,用来实现编译期间的断言,叫静态断言

static_assert优势静态断言在编译时进行处理,不会产生任何运行时刻空间和时间上的开销,这就使得它比assert宏具有更好的效率。另外比较重要的一个特性是如果断言失败,它会产生有意义且充分的诊断信息,帮助程序员快速解决问题

static_assert

语法:static_assert(常量表达式,要提示的字符串);
如果第一个参数常量表达式的值为false,会产生一条编译错误,错误位置就是该static_assert语句所在行,第二个参数就是错误提示字符串。然后通过调用 abort 来终止程序运行。

使用static_assert优点:

  1. 可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。
  2. static_assert可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。
  3. 编译器在遇到一个static_assert语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。
  4. 性能方面,由于是static_assert编译期间断言,不生成目标代码,因此static_assert不会造成任何运行期性能损失

简单例子:

  1. *static_assert(sizeof(void ) == 4, “64位系统上不支持”)
    该static_assert用来确保编译仅在32位的平台上进行,不支持64位的平台,该语句可以放在文件的开头处,这样可以尽早检查,以节省失败情况下的编译时间。

  2. 模板函数使用静态断言static_assert可在编译期识别模板实例化错误
    在这里插入图片描述
    注意:static_assert的断言表达式的结果必须是在编译时期可以计算的表达式,即必须是常量表达式。如果使用变量,则会导致错误。

除了static_assert之外,c++还有assert#error两个也是用来检查错误的。

assert

assert运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是有影响的,所以经常在发行版本中,assert都会被关掉;

函数原型:
#include<assert.h>
void assert(int expression);

assert是运行期的判断,并且会强制终止程序,一般要求只能用于debug版本中是为了尽可能快的发现问题。assert是要从release版本中去掉。所以一般开发会重新定义assert宏。

error

error可看做预编译期断言,甚至都算不上断言,仅仅能在预编译时显示一个错误信息,它能做的不多,可以配合#ifdef/ifndef参与预编译的条件检查,由于它无法获得编译信息,当然就做不了更进一步分析了。
例如
在这里插入图片描述

参考链接:
https://www.cnblogs.com/hjh-666/p/15894148.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值