读loki有感 : 编译事(而不是运行时)的断言(assert)

简介: 读loki有感 : 编译事(而不是运行时)的断言(assert)

本文环境:VS2005(VC8)

问题一:如果int不是64位,编译无法通过。

char test[sizeof(int)==8];//如果此行编译不过,原因:系统不是64位

原理:

数组的元素不能为0。

类似情况:

Window的int低位在前,高为在后。linux相反,安卓是基于linux的。

问题二:较大类别不能转化成较小类别,比如:int到char。

template<class FROM,class TO>
TO Change(const FROM& from)
{
    {
        char test[sizeof(TO)>=sizeof(FROM)];//如果此行编译不过,原因:FROM比TO长
    }
    return from;
}

如下使用没问题:

long i = Change<short,long>(1);

如下使用有问题:

short l = Change<long,short>(2);

VC8的错误信息如下:

1>f:\test\testdlg.cpp(630) : error C2466: 不能分配常量大小为 0 的数组
1>        f:\test\testdlg.cpp(645): 参见对正在编译的函数 模板 实例化“TO Change<long,short>(const FROM &)”的引用
1>        with
1>        [
1>            TO=short,
1>            FROM=long
1>        ]


试了一下loki的方法,VC8下提示过于相信。反而不好找错误。


相关文章
|
4月前
crash工具使用 —— 省去输入struct或者union关键字
crash工具使用 —— 省去输入struct或者union关键字
|
6月前
|
测试技术
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
81 3
|
6月前
|
存储 数据库
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
|
8月前
|
安全 算法 编译器
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
175 1
|
C语言 C++
【C++】 --- 写个函数在main函数执行前先运行
【C++】 --- 写个函数在main函数执行前先运行
154 0
|
8月前
|
C#
C#调试与测试 | Assert(断言)
什么是Assert呢? 断言是一种用于在程序运行时检查条件是否满足的工具。如果条件不满足,断言就会抛出一个异常,从而帮助我们快速定位问题并进行调试。 在C#中,可以使用Debug.Assert方法来实现断言,该方法接受一个布尔表达式作为参数,如果该表达式的值为false,就会抛出一个AssertionFailedException异常。
340 0
Mgo
|
Shell Go
go调用shell命令两种方式实现(有无返回值)
go调用shell命令两种方式实现(有无返回值)
Mgo
1629 1
|
测试技术 C++ Python
pytest 执行规则_基本用法_常用插件_常用断言_常用参数
pytest 执行规则_基本用法_常用插件_常用断言_常用参数
|
IDE Java 编译器
记一次inline使用不当导致编译期Null指针的排查过程
周五的一个下午,我哼着小曲和往常一样合完代码。准备运行试试看,结果build时发现了这样一个异常。
150 0
记一次inline使用不当导致编译期Null指针的排查过程