前言

assert, 翻译可能是断言,本质是个宏定义,不是函数
在C++中要使用assert需要将头文件<cassert>引入,虽然cassert本质上引用的是<assert.h>

它的作用在其他语言中是一样的,就是说如果他里面的条件返回错误,代码会终止运行并且将源文件以及错误的代码和行号都输出出来。


正文

1
2
3
4
5
6
7
8
9
#include<iostream>
#include<cassert>

int main(){

assert(false);

return 0;
}

弹出的类似这样。

像一些特殊场景我们想要输入的时候不为0,以便参与下一次运算。当然debug模式和release模式情况可能稍有不同,因为release模式下会自动屏蔽掉assert的功能。
但是通过assert在debug下直接弹出一个警告框效果也不错。

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
#include<cassert>

int main(){
int x;
std::cout << "请输入一个数:";
std::cin >> x;
assert(x);
std::cout << 1000 / x;

return 0;
}

这其实跟try一个异常有些许类似。

重试的话就是重新运行,忽略的话下面的cout还是有问题会打断。结束就是结束运行了。

应用场景远不止仅限于此。


屏蔽assert的话,可以定义一个宏。
#define NDEBUG

但是宏定义需要在引入头文件<cassert>之前。否则按顺序展开的话不起作用。
用这个的原因也是因为有的时候不需要去看这个异常,一般这种都是为了debug调试用的。

转到定义后,可以看到其实也是利用了一些编译器提供好的功能


static_assert

static_assert 用于编译时检查条件
static_assert(bool表达式,”错误信息“);

c++17的新语法中:
static_assert(bool表达式);
与assert不同,static_assert主要是用来在编译时检查重要的条件
因此检查的bool表达式中,只能用于

static_assert不需要头文件cassert

1
static_assert(0, "this is 0");

注意,表达式的位置必须是常量或者表达式

如果想用它判断编译环境,比如x86还是x64 可以用之前预定义的宏

1
static_assert(_WIN32, "this is 0");

像这种情况,我们处于x86模式编译自然会通过。如果改成_WIN64的话

1
static_assert(_WIN64, "this is 0");

在x86下,会提示未定义:

改成x64运行就没问题了。

当然这个属于msvc的预定义宏,想要更直观的,也可以通过sizeof看指针的大小去判断环境

1
static_assert(sizeof(int*)==4, "it's not 4");

在x86下 指针大小是四字节所以没问题
如果是x64下 指针大小占用八字节 所以会报错。


结语

那么相比较之下,static_assert似乎还好用点,也不用引用头文件就能调用,而且debug的时候不一定需要这种弹窗效果,能产生报错信息不错了。