C++中的static_assert, assert和#error

这里介绍C++中用于断言的三种方式

static_assert

static_assert是C++11最新的关键字。用于静态断言,其用法如下:

1
2
static_assert(布尔常量表达式, 消息)
static_assert(布尔常量表达式)

如果给出了消息参数,那么当布尔常量表达式为false的时候会输出消息。

assert

这是C/C++共同拥有的断言方法,在cassert文件中

1
assert(表达式)

如果表达式为0会终止程序并且输出一些提示信息(注意是表达式为0而不是表达式为false)。

这里需要注意的是:assert是仿函数宏(也就是形如#define f(x)这种),你这样写assert(b==false)是不行的,必须用括号将表达式扩起来才行写assert((b==false))

而且根据assert的实现,如果你在程序中定义了NDEBUG宏,那么assert函数会什么也不做(当然你得在包含cassert之前声明)。这样我们就可以方便的在调试模式和非调试模式下切换了。

#error

这个也是C/C++共用的,属于预处理命令:

1
#error 信息

这个宏只要一出现就会在预编译阶段在有#error的这一行阻止程序,所以你会看到编译器给你在#error处报一个错。

使用方法的话一般是和#ifdef, #ifndef搭配使用:

1
2
3
#ifndef MAC
#error 不是Mac电脑
#endif

这里如果不是Mac电脑我们就不允许编译。

updatedupdated2025-08-022025-08-02