现在的位置: 首页 > 综合 > 正文

assert,assert_static和static_assert区别

2014年10月17日 ⁄ 综合 ⁄ 共 649字 ⁄ 字号 评论关闭

assert没什么好说的,大家都见过了。

static_assert和assert_static是c++11中新增的宏定义。

assert适用于运行时的断言,也就是说,如果程序不运行,我们根本不知道有没有错,但是有些时候,我们希望在编译的时候就可以让编译器检测到错误,所以在c++11中新增了assert_static,也就是静态断言。例如:

#include <cstring>

using namespace std;

#define assert_static(e) \

do{
\

enum { assert_static__ = 1/(e)};
\

}while(0)

template <typename T,typename u> int bit_copy(T&a,u&b)

{

assert_static(sizeof(a) == sizeof(b));

memcpy(&a,&b,sizeof(b));

}

如上我们用除以0会产生错误来实现静态断言,当实例化模板的时候,如果a和b的类型长度不一样,那么编译器就会产生错误。但是错误提示是“除以0错误”,这样子的错误提示对于不熟悉这个宏定义的人来说,简直就是天书,c++11为了解决这个问题又新增了一个叫做static_assert的东西,static_assert接受两个参数,第一个是判断表达式,第二个就是一个字符串的错误提示:

例如:static_assert(a==b,"a!=b");,当产生错误的时候,编译器就会提示:a!=b,这样就明显多了………………,也为我们苦逼的码农解决了生命。

抱歉!评论已关闭.