C++的静态类型检查详解

 更新时间:2022年02月21日 08:47:31   作者:summer_sunrise  
这篇文章主要为大家详细介绍了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语言入门篇--定义宏#define的概述

    C语言入门篇--定义宏#define的概述

    本篇文章是C语言系列基础篇,适合c语言刚入门的朋友,本文对关于c语言的定义宏#define作了简要的概述,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • c++中try catch的用法小结

    c++中try catch的用法小结

    这篇文章主要介绍了c++中try catch的用法小结,需要的朋友可以参考下
    2018-01-01
  • C语言 条件判断详细介绍

    C语言 条件判断详细介绍

    本文主要讲解C语言 条件判断,这里整理了相关资料,详细说明了判断语句知识要点,希望能帮助学习C语言的同学
    2016-08-08
  • C++实现LeetCode(12.整数转化成罗马数字)

    C++实现LeetCode(12.整数转化成罗马数字)

    这篇文章主要介绍了C++实现LeetCode(12.整数转化成罗马数字),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现倒置字符串的两种方法分享

    C语言实现倒置字符串的两种方法分享

    这篇文章主要和大家详细介绍了利用C语言实现倒置字符串的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手尝试一下
    2022-08-08
  • 详解数据结构C语言实现之循环队列

    详解数据结构C语言实现之循环队列

    在我们生活中有很多队列的影子,可以说与时间相关的问题,一般都会涉及到队列问题;本文详细介绍了如何使用C语言实现循环队列,下面一起来看看。
    2016-07-07
  • C语言实现直角坐标转换为极坐标的方法

    C语言实现直角坐标转换为极坐标的方法

    这篇文章主要介绍了C语言实现直角坐标转换为极坐标的方法,涉及C语言进行三角函数与数值运算相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • C++中实现线程安全和延迟执行详解

    C++中实现线程安全和延迟执行详解

    这篇文章主要为大家详细介绍了C++中实现线程安全和延迟执行的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以了解下
    2024-01-01
  • C语言零基础彻底掌握预处理上篇

    C语言零基础彻底掌握预处理上篇

    在C语言的程序中包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分,通过预处理命令可扩展C语言程序设计的环境
    2022-08-08
  • C语言扫雷游戏的简单实现

    C语言扫雷游戏的简单实现

    这篇文章主要为大家详细介绍了C语言扫雷游戏的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论