C++好用的static_assert

程序:
#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_ASSERTLOKI_STATIC_CHECK,但由于它们都是利用了一些编译器的隐晦特性实现的trick,可移植性、简便性都不是太好,还会降低编译速度,而且功能也不够完善,例如BOOST_STATIC_ASSERT就不能定义错误提示文字,而LOKI_STATIC_CHECK则要求提示文字满足C++类型定义的语法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值