在C++11之前只有动态断言,也就是程序必须要运行,才能知道问题。这种方式就不大利于程序的编写调试。
C++11之前用的断言是——assert宏,大家可以转到这篇:assert宏运用
接下来要讲的是静态断言,也就是在编译期间就能判断出问题。
写个例子来说明为什么静态断言有时会比动态断言好。
动态断言例:assert
1 2 3 4 5 |
template<class T,class U> int Copy(T& a, U& b) { assert( sizeof(b) == sizeof(a) ); memcpy(&a,&b,sizeof(b)); } |
可以发现,一定要运行程序后调用Copy,才能真正的调用这个断言。如果在当下并没有调用Copy函数,哪么之后发布程序后别人再调用就可能会出问题。
C++11静态断言例:static_assert
1 2 3 4 5 |
template<class T,class U> int Copy(T& a, U& b) { static_assert( sizeof(b) == sizeof(a), "the parameters of copy must have same width."); memcpy(&a,&b,sizeof(b)); } |
使用了静态断言后,在编译时刻就能排错,错误代码也非常清楚:the parameters of copy must have same width. 很方便查找到问题。
static_assert使用注意点:
- static_assert可以用于任何名字空间,可独立于任何函数调用之外运行,
1 2 3 4 5 6 |
static_assert(sizeof(int) == 32,"os is 32bit"); int main() { return 0; } |
- static_assert断言表达式的结果必须要在编译时刻就能确定
1 2 3 4 5 |
int FUN(int n) { //错误n在编译时刻无法确定 static_assert(n>0, "value must greater than 0"); } |