一、#error
执行期间是预编译阶段,目的是配合 #ifdef / #ifndef 参与预编译的条件检查,显示一段错误信息。
二、static_assert
static_assert(bool flag, char *msg);
- 编译期断言,程序在编译的过程中执行。
- 若 flag 为真,什么也不做。
- 若 flag 为假,产生一条编译错误,输出错误信息 msg,错误位置为当前行号。
static_assert 可以放在代码中任何位置,可以增加编译期对程序的控制,准确定位出错的可能。
三、assert
assert(bool flag);
- assert 是从 C 语言中继承过来的的断言方式,运行期下的断言。
- 若 flag 为真,什么也不做。
- 若 flag 为假,终止程序。
注意 assert 默认无论在 Debug 还是 Release 下均是有效的,如果想要只在 Debug 下生效,需要在
#include <cassert>
之前增加宏
#define NDEBUG
static_assert(1 == 2, "1 not equal 2.");
#include <iostream>
#define NDEBUG
#include <cassert>
#ifdef NDEBUG
#error "define NDDEBUG"
#endif
int main()
{
int i = 0;
assert(i == 2);
return 0;
}
编译结果:
test.cc:11:2: error: #error "define NDDEBUG"
#error "define NDDEBUG"
^~~~~
test.cc:1:1: error: static assertion failed: 1 not equal 2.
static_assert(1 == 2, "1 not equal 2.");
^~~~~~~~~~~~~
因为 #error 发生在预编译阶段,static_assert 发生在编译阶段,所以 #error 信息先显示,static_assert 后显示。
(SAW:Game Over!)