C++中包含动态断言(assert)和静态断言(static_assert),下面分别分析各自的用法。
1.动态断言(assert)
assert 是一个宏,在预处理阶段不生效,在运行阶段才起作用,所以又叫“动态断言”。
动态断言用来判定一个表达式必定为真。表达式如果返回false,就会输出错误消息,然后调用 abort() 终止程序的执行。
assert(i > 0);
assert(p != nullptr);
assert(!str.empty());
上述断言分别在运行阶段判定:(1)变量i是整数;(2)指针p不为空;(3)字符串str不是空字符。
动态断言可以附加错误信息,方便用户查看。
assert(i > 0 && "i must be greater than zero");
assert(p != nullptr && "p must not be null");
assert(!str.empty() && "str must not be empty");
2.静态断言(static_assert)
static_assert是一个关键字,而不是宏定义。它在编译阶段生效,在运行阶段是看不到的,所以又叫”静态断言“。
静态断言用来判定一个表达式必定为真。表达式如果返回false,就会编译失败,抛出错误信息。
static_assert(__GNUC__ || __clang__);
static_assert(_MSC_VER);
上述断言分别在编译阶段判定:(1)是否使用了 GCC 或 Clang 编译器;(2)检查是否使用了 Microsoft Visual Studio 编译器;
静态断言可以附加错误信息,方便用户查看。
static_assert(std::is_same<int, int>::value, "C++11 is not supported");
static_assert(std::is_null_pointer<std::nullptr_t>::value, "C++14 is not supported");
上述断言分别在编译阶段判定:(1)是否支持 C++11 的 std::is_same 类型特性;(2)是否支持 C++14 的 std::is_null_pointer 类型特性。