读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天前
|
编译器 C++
VS编译器对scanf函数不安全报错的解决办法(详细步骤)
VS编译器对scanf函数不安全报错的解决办法(详细步骤)
|
2月前
|
安全 算法 编译器
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
42 1
|
2月前
|
传感器 安全 编译器
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
62 0
|
5月前
|
C#
C#调试与测试 | Assert(断言)
什么是Assert呢? 断言是一种用于在程序运行时检查条件是否满足的工具。如果条件不满足,断言就会抛出一个异常,从而帮助我们快速定位问题并进行调试。 在C#中,可以使用Debug.Assert方法来实现断言,该方法接受一个布尔表达式作为参数,如果该表达式的值为false,就会抛出一个AssertionFailedException异常。
90 0
|
8月前
|
安全 编译器 Go
读<一例 Go 编译器代码优化 bug 定位和修复解析>
读<一例 Go 编译器代码优化 bug 定位和修复解析>
83 0
|
12月前
|
测试技术 C++ Python
pytest 执行规则_基本用法_常用插件_常用断言_常用参数
pytest 执行规则_基本用法_常用插件_常用断言_常用参数
|
12月前
|
搜索推荐 Java 编译器
Java 断言 assert 你真的会用嘛?
Java assert 断言机制是 Java 5 中推出的新特性,它主要用于在程序运行时检查状态或假设的正确性,并在不正确时抛出 AssertionError 异常。使用 assert 断言可以使代码更加健壮、可靠,提高程序的可维护性和可读性。
234 0
|
数据可视化 测试技术 Go
golang 单测运行单个函数、文件、跳过文件命令
golang 单测运行单个函数、文件、跳过文件命令
|
Linux Windows
编译OpenJDK8-u302出错:error C3861: “INT64_C”: 找不到标识符
编译OpenJDK8-u302出错:error C3861: “INT64_C”: 找不到标识符
95 0