服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++的静态类型检查详解

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

2022-09-27 15:22summer_sunrise C/C++

这篇文章主要为大家详细介绍了C++的静态类型检查,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

什么时候引进的?

在带类的C的时候,引进了静态(“强”)类型检查。

bjarne在《The Design and Evolution of C++ 》介绍:

在经历过Simula和Algol68的经验之后,静态类型检查对于我而言已经是一种必需品,唯一的问题是如何把它加进来

一个有趣的观察

学过带类的C(或C++)的程序员竟丧失了寻找由于简单类型错误而造成的运行错误的能力。由于他们逐渐习惯于依赖带类的C(或C++)所提供的类型检查和类型转换,甚至丧失了快速地发现某些愚蠢错误的能力,而这些错误是由于缺乏检查而混进C程序的。进而他们也不能为避免这种愚蠢错误而采取预防措施,而好的C程序员则会把这些看作是理所当然的事情(好的C程序员牛B)。

当习惯了某种便利时,如果便利突然消失,将不知多措。

窄转换

C语言中没有对类型转换做任何检查;考虑如下代码

?
1
2
3
4
5
6
7
8
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起初尝试禁止所有不能保持值不变的转换,也就是说,只要想把一个大的对象存储到较小的对象里,就要求明显地写出转换运算符:

?
1
2
3
4
5
6
7
8
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++的编译系统发出警告。

例如:

?
1
2
3
4
5
6
7
int main()
{
    double d = 3.14;
    int k = d;
    char c = k;
    return 0;
}

编译:

g++ main.cpp -Wconversion -o main

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

当前g++版本中如果需要显示这些警告需要的加上-Wconversion才会显示(-Wall中也没有包含,体外话,-Wall 是 Warnning all的缩写)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!  

原文链接:https://blog.csdn.net/uestcyms/article/details/123036782

延伸 · 阅读

精彩推荐
  • C/C++C++ OpenCV实现图像去水印功能

    C++ OpenCV实现图像去水印功能

    本文将介绍如何使用OpenCV C++ 进行简单图像水印去除。我们在网上download图片时,经常因为版权问题有水印。本案例通过编写算法进行简单水印去除。需要的...

    Zero___Chen8002022-08-24
  • C/C++C语言自定义类型的保姆级讲解

    C语言自定义类型的保姆级讲解

    这篇文章主要给大家介绍了关于C语言自定义类型的保姆级讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    teacher dsma4972021-10-27
  • C/C++关于函数调用方式__stdcall和__cdecl详解

    关于函数调用方式__stdcall和__cdecl详解

    下面小编就为大家带来一篇关于函数调用方式__stdcall和__cdecl详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    99re4252021-04-16
  • C/C++C语言链表详解及代码分析

    C语言链表详解及代码分析

    这篇文章主要介绍了C语言链表详解及代码分析,说明了链表的定义与概念,通过详细的代码展示了基于链表的增删改查功能,希望本文能对你有所帮助...

    code.com10132021-11-18
  • C/C++使用C语言实现字符串逆序操作案例

    使用C语言实现字符串逆序操作案例

    这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下...

    sugar high11382021-11-21
  • C/C++关于C++类的成员初始化列表的相关问题

    关于C++类的成员初始化列表的相关问题

    下面小编就为大家带来一篇关于C++类的成员初始化列表的相关问题。小编觉得挺...

    C++教程网6762021-04-02
  • C/C++C语言实现24点问题详解

    C语言实现24点问题详解

    24点问题就是在屏幕上输入1〜10范围内的4个整数(可以有重复),对它们进行加、减、乘、除四则运算后(可以任意的加括号限定计算的优先级),寻找计...

    小辉_Super5452022-08-01
  • C/C++深入探讨C++父类子类中虚函数的应用

    深入探讨C++父类子类中虚函数的应用

    本篇文章是对C++父类子类中虚函数的使用进行了详细的分析介绍,需要的朋友参考下...

    C++教程网3842020-12-10