【编译器角度】assert
前言
assert, 翻译可能是断言,本质是个宏定义,不是函数
在C++中要使用assert需要将头文件<cassert>引入,虽然cassert本质上引用的是<assert.h>
它的作用在其他语言中是一样的,就是说如果他里面的条件返回错误,代码会终止运行并且将源文件以及错误的代码和行号都输出出来。
正文
1 |
|
弹出的类似这样。
像一些特殊场景我们想要输入的时候不为0,以便参与下一次运算。当然debug模式和release模式情况可能稍有不同,因为release模式下会自动屏蔽掉assert的功能。
但是通过assert在debug下直接弹出一个警告框效果也不错。
1 |
|
这其实跟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的时候不一定需要这种弹窗效果,能产生报错信息不错了。