C++的静态类型检查详解
目录
- 什么时候引进的?
- 一个有趣的观察
- 窄转换
- 警告的使用
- 总结
什么时候引进的?
在带类的C的时候,引进了静态(“强”)类型检查。
bjarne在《The Design and Evolution of C++ 》介绍:
在经历过Simula和Algol68的经验之后,静态类型检查对于我而言已经是一种必需品,唯一的问题是如何把它加进来
一个有趣的观察
学过带类的C(或C++)的程序员竟丧失了寻找由于简单类型错误而造成的运行错误的能力。由于他们逐渐习惯于依赖带类的C(或C++)所提供的类型检查和类型转换,甚至丧失了快速地发现某些愚蠢错误的能力,而这些错误是由于缺乏检查而混进C程序的。进而他们也不能为避免这种愚蠢错误而采取预防措施,而好的C程序员则会把这些看作是理所当然的事情(好的C程序员牛B)。
当习惯了某种便利时,如果便利突然消失,将不知多措。
窄转换
C语言中没有对类型转换做任何检查;考虑如下代码
void f() { long int lng = 65000; int i1 = lng; // i1 becomes negative -536 on machines with 16 bit ints int i2 = 257; char c = i2; // truncates: c becomes 1 on machines with 8 bit chars }
当bjarne起初尝试禁止所有不能保持值不变的转换,也就是说,只要想把一个大的对象存储到较小的对象里,就要求明显地写出转换运算符:
void g(long lng, int i) { int i1 = lng; // error: narrowing conversion i1 = (int)lng; // truncates for 16 bit ints char c = i; // error: narrowing conversion c = (char)i; // truncates }
这个试验失败得很惨。因为检查了每个C程序都包含大量从int到char变量的赋值(都是正常工作的程序,绝大数必然是安全的);在带类的C的团体中,没有人希望这样背离C语言。所以无法禁止所有不能保持值不变的转换。那还有什么弥补的措施吗? 有,编译器警告。
警告的使用
当发现C语言里那些我认为极端严重而不能忽略的弱点,但这些弱点又因为在C语言的结构里根深蒂固而无法去除。就让C++的编译系统发出警告。
例如:
int main() { double d = 3.14; int k = d; char c = k; return 0; }
编译:
g++ main.cpp -Wconversion -o main
当前g++版本中如果需要显示这些警告需要的加上-Wconversion才会显示(-Wall中也没有包含,体外话,-Wall 是 Warnning all的缩写)
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
相关推荐
-
解析C++中的虚拟函数及其静态类型和动态类型
虚拟函数是C++语言引入的一个很重要的特性,它提供了"动态绑定"机制,正是这一机制使得继承的语义变得相对明晰. (1)基类抽象了通用的数据及操作,就数据而言,如果该数据成员在各派生类中都需要用到,那么就需要将其声明在基类中:就操作而言,如果该操作对各派生类都有意义,无论其语义是否会被修改或扩展,那么就需要将其声明在基类中. (2)有些操作,如果对于各个派生类而言,语义保持完全一致,而无需修改或扩展,那么这些操作声明为基类的非虚拟成员函数.各派生类在声明为基类的派生类时,默认继承了这些非
-
JavaScript静态类型检查工具FLOW简介
Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可以帮助我们捕获JavaScript开发中的常见错误,而不需要额外地修改你原有的代码,比如静态类型转换,空值引用等问题. 同时,Flow为JavaScript添加了静态类型的语法标识,这样开发者便可以明确代码中的类型,让其自动地被Flow所维护. 目前,Flow具有以下两特性: 1. Flow的类型检查具有可选性 除非你明确告诉Flow需要对某些文件
-
深入解析C++中的动态类型转换与静态类型转换运算符
dynamic_cast 运算符 将操作数 expression 转换成类型为type-id 的对象. 语法 dynamic_cast < type-id > ( expression ) 备注 type-id 必须是一个指针或引用到以前已定义的类类型的引用或"指向 void 的指针".如果 type-id 是指针,则expression 的类型必须是指针,如果 type-id 是引用,则为左值. 有关静态和动态强制转换之间区别的描述,以及各在什么情况下适合使用,请参见 s
-
Flow之一个新的Javascript静态类型检查器
今天我们兴奋的发布了 Flow 的尝鲜版,一个新的Javascript静态类型检查器.Flow为Javascript添加了静态类型检查,以提高开发效率和代码质量.更明确的说,静态类型检查提供的好处像早期错误检查,帮助你发现一些只有在运行时才能发现的错误,以及代码智能感知,它会帮助代码维护,查找,重构和优化. 我们设计Flow的所有功能构建在现有Javascript规范之上.因为Flow主动地在后台工作,所以额外的编译开销很小.Flow并不要求开发者如何编写代码 -- 她用一套复杂的算法分析你熟悉
-
C++的静态类型检查详解
目录 什么时候引进的? 一个有趣的观察 窄转换 警告的使用 总结 什么时候引进的? 在带类的C的时候,引进了静态(“强”)类型检查. bjarne在<The Design and Evolution of C++ >介绍: 在经历过Simula和Algol68的经验之后,静态类型检查对于我而言已经是一种必需品,唯一的问题是如何把它加进来 一个有趣的观察 学过带类的C(或C++)的程序员竟丧失了寻找由于简单类型错误而造成的运行错误的能力.由于他们逐渐习惯于依赖带类的C(或C++)所提供的类型检查
-
如何为你的JS项目添加智能提示与类型检查详解
前言 最近在做项目代码重构,其中有一个要求是为代码添加智能提示和类型检查.智能提示,英文为 IntelliSense,能为开发者提供代码智能补全.悬浮提示.跳转定义等功能,帮助其正确并且快速完成编码.说起来,JavaScript 作为一门动态弱类型解释型语言,变量声明后可以更改类型,并且类型在运行时才能确定,由此容易产生大量代码运行中才能发现的错误,相比 Java 等静态类型语言,开发体验上确实差了一截.更烦躁的是,智能提示就是依赖于静态类型检查的,所以在以前,指望 JavaScript 的智能
-
Java中静态类型检查是如何进行的实例思路详解
以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: •静态类型检查:基于程序的源代码来验证类型安全的过程: •动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间分析程序,确保没有类型错误.基本的思想是不要让类型错误在运行期间发生. 以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的. 代码示例 假定我们有如下类,A和B,B继承A. class A { A me() { return this; } public void do
-
Java的静态类型检查示例代码详解
关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间分析程序,确保没有类型错误.基本的思想是不要让类型错误在运行期间发生. 在各色各样的编程语言中,总共存在着两个类型检查机制:静态类型检查和动态类型检查. 静态类型检查是指通过对应用程序的源码进行分析,在编译期间就保证程序的类型安全. 动态类型检查是在程序的运行过程中,验证程序的类型安全.在Java中,编译期间使用静态类型
-
Java 类型信息详解和反射机制介绍
RTTI RTTI(RunTime Type Information)运行时类型信息,能够在程序运行时发现和使用类型信息,把我们从只能在编译期知晓类型信息并操作的局限中解脱出来 传统的多态机制正是 RTTI 的基本使用:假设有一个基类 Shape 和它的三个子类 Circle.Square.Triangle,现在要把 Circle.Square.Triangle 对象放入 List<Shape> 中,在运行时,先把放入其中的所有对象都当作 Object 对象来处理,再自动将类型转换为 Shap
-
Java8新特性之重复注解与类型注解详解
目录 Java8新特性重复注解与类型注解 一.JDK5中的注解 1.注解(@) 2.作用 3.如何理解注解? 4.关于注解 5.注解分为三个阶段 6.注解的属性类型 7.为注解增加属性 二.Java8中的注解 1.类型注解 2.重复注解 三.Java8对注解的增强 Java8新特性重复注解与类型注解 在Java8之前,在某个类或者方法,字段或者参数上标注注解时,同一个注解只能标注一次.但是在Java8中,新增了重复注解和类型注解,也就是说,从Java8开始,支持在某个类或者方法,字段或者参数上标
-
为Vue3 组件标注 TS 类型实例详解
目录 为 props 标注类型 使用 <script setup> 非 <script setup> 为 emits 标注类型 使用 <script setup> 非 <script setup> 为 ref() 标注类型 默认推导类型 通过接口指定类型 通过泛型指定类型 为 reactive() 标注类型 默认推导类型 通过接口指定类型 为 computed() 标注类型 默认推导类型 通过泛型指定类型 为事件处理函数标注类型 为 provide / in
-
SpringMVC静态资源配置过程详解
目录 springmvc静态资源配置 1. 在java配置文件中配置DefaultServletHttpRequestHandler来进行处理 2. 在java配置文件中配置ResourceHttpRequestHandler来进行处理 3. web.xml配置servlet映射 最后 补充 springmvc静态资源配置 <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>or
-
关于JavaScript和jQuery的类型判断详解
对于类型的判断,JavaScript用typeof来进行. 栗子: console.log(typeof null); //object console.log(typeof []); //object console.log(typeof {}); //object console.log(typeof new Date()); //object console.log(typeof new Object); //object console.log(typeof function(){});
-
C++中 静态局部变量实例详解
C++中 静态局部变量实例详解 以前经常使用和了解static作用在全局变量前,以至于甚至把static当做全局变量的代名词,但是其实static还可以作用于局部变量前 静态局部变量的意义: 1.分配空间在全局数据栈上 2.作用域只局限于当前的函数范围内(局部) 3.生命周期为整个程序,不会随着当前的函数结束而结束 4.首次初始化时赋值生效,以后的初始化赋值自动跳过 如 void fn() { static n=10; cout<<n<<endl; n++; } 这里的n是一个静
随机推荐
- C# 使用Free Spire.Presentation 实现对PPT插入、编辑、删除表格
- FTP命令基本使用方法
- Bootstrap下拉菜单样式
- PHP的Yii框架中使用数据库的配置和SQL操作实例教程
- 一个ASP创建动态对象的工厂类(类似PHP的stdClass)
- 深入理解Go语言中的Dispatcher
- JS中如何实现点击a标签返回页面顶部的问题
- Alt+Ctrl+Del与Shift+Ctrl+Esc的区别剖析
- lua中使用packagepath解决多个项目的路径冲突问题
- 分享:在存储过程中使用另一个存储过程返回的查询结果集的方法
- 不要使用jQuery触发原生事件的方法
- 原生js编写焦点图效果
- JavaScript全屏和退出全屏事件总结(附代码)
- 通过端口1433连接到主机127.0.0.1的 TCP/IP 连接失败,错误:“connect timed out”的解决方法
- java导出大批量(百万以上)数据的excel文件
- layer实现关闭弹出层刷新父界面功能详解
- 浅谈iOS中几个常用协议 NSCopying/NSMutableCopying
- java volatile关键字作用及使用场景详解
- centos7修改网关和配置ip的方法示例
- 详解C语言中的字符串数组