Cpp / #error、static_assert、assert 区别

一、#error

执行期间是预编译阶段,目的是配合 #ifdef / #ifndef 参与预编译的条件检查,显示一段错误信息。

二、static_assert

static_assert(bool flag, char *msg);
  1. 编译期断言,程序在编译的过程中执行。
  2. 若 flag 为真,什么也不做。
  3. 若 flag 为假,产生一条编译错误,输出错误信息 msg,错误位置为当前行号。

static_assert 可以放在代码中任何位置,可以增加编译期对程序的控制,准确定位出错的可能。

三、assert

assert(bool flag);
  1. assert 是从 C 语言中继承过来的的断言方式,运行期下的断言
  2. 若 flag 为真,什么也不做。
  3. 若 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!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值