程序:
#include <iostream>
#include <cassert>
#include <cstring>
using namespace std;
//使用模板实现一个位比较的函数
template<typename T, typename U>
int bitCopy(T& t, U& u) {
static_assert(sizeof(t) == sizeof(u), "two params is not equal!");
memcpy(&t, &u, sizeof(u));
}
int main() {
//判断机器是否是64位机器
//static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
const int i = 0;
//assert(i>0);//运行时出错
//static_assert(i>0, "value must big than 0");//编译时出错
int a = 10;
double b = 10.0;
//编译报错,因为两个值的size不同
bitCopy(a, b);
return 0;
}
参考连接:https://www.cnblogs.com/guxuanqing/p/10618816.html
assert是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是有影响的,所以经常在发行版本中,assert都会被关掉;并且需要包含头文件#include <cassert>
#error可看做预编译期断言,甚至都算不上断言,仅仅能在预编译时显示一个错误信息,它能做的不多,可以配合#ifdef/ifndef参与预编译的条件检查,由于它无法获得编译信息,当然就做不了更进一步分析了。
在stastic_assert提交到C++0x标准之前,为了弥补assert和#error的不足,出现了一些第三方解决方案,可以作编译期的静态检查,例如:BOOST_STATIC_ASSERT和LOKI_STATIC_CHECK,但由于它们都是利用了一些编译器的隐晦特性实现的trick,可移植性、简便性都不是太好,还会降低编译速度,而且功能也不够完善,例如BOOST_STATIC_ASSERT就不能定义错误提示文字,而LOKI_STATIC_CHECK则要求提示文字满足C++类型定义的语法。