C++> static_assert静态断言与assert动态断言

1. static_assert

static_assert静态断言,是C++关键字,作用是让编译器在编译期对常量表达时进行断言。如果通过,就不报错;如果不通过,就报错
用法:

static_assert(常量表达式, 错误提示信息);

常量表达式的值为true或者false,或者可以转化为true/false。
如果断言不通过,程序编译也不会通过。

2. assert

assert动态断言,从C继承过来的宏定义,头文件assert.h。
从下面源码可以看到,assert是把表达式通过static_cast转换成bool类型,从而实现断言。

// # if defined __cplusplus

#  define assert(expr)							\
     (static_cast <bool> (expr)						\
      ? void (0)							\
      : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))

assert不管断言是否通过,都不会影响编译。

3. static_assert与assert主要区别

  • 断言通关是否影响编译
    static_cast: 断言不通过编译出错,因为是编译器在编译器进行检查;
    assert: 断言不通过不会影响编译,程序运行时检查;
static const int a = 0;
static_assert(a > 1, "error1");  // 无法通过编译
static_assert(a > -1, "error2"); // 可以通过编译

assert(0); // 可以通过编译, 但无法继续运行
assert(1); // 可以通过编译, 可以继续运行
  • 是否影响程序运行效率
    static_assert: 所包含的代码不会生成目标代码,不会影响程序性能;
    assert: 会影响程序性能,常用于调试阶段,正式释放软件时通常关闭assert功能;

参考c++静态断言(static_assert)

posted @ 2021-03-21 17:53  明明1109  阅读(662)  评论(0编辑  收藏  举报