在C++中,标准在<cassert>或者<assert.h>头文件中未程序员提供了assert宏,例如:
#include <cassert>
using namespace std;
char* arrayAlloc(int n){
assert(n>0);
return new char[n];
}
int main(){
char* a = arrayAlloc(0);
}
C++中,可以通过定义宏NDEBUG来禁用assert宏,对发布来说是应该禁用的。定义NDEBUG后,assert宏将被展开为一条无意义的C语句并被编译期优化掉。
还有种方法是通过#error这样的预处理指令,例如:
#ifndef _COMPLEX_H
#error "Never use xxxx"
#endif
注意,断言宏assert只有在程序运行的时候才能起作用,而#error只在编译器处理时才能起作用,编译时断言可以用static_assert,接受两个参数,一个是断言表达式,一个是输出的错误信息,例如:
template<typename t, typename u> int bit_copy(t& a, u& b){
static_assert(sizeof(b) == sizeof(a), "the params of bit_copy must have same width");
}
需要注意的是,static_assert的断言表达式的结果必须是编译时期可以计算的表达式,即必须是常量表达式,不可以用变量。
网友评论