C++的静态类型检查

本文探讨了C++引入静态类型检查的背景及其重要性,指出静态类型检查如何帮助防止编程错误。作者Bjarne在尝试加强类型转换安全性时遇到挑战,因大量合法但潜在危险的转换导致实验失败。最终,C++通过编译器警告来提示可能的窄转换问题,以平衡安全性和兼容性。文章以代码示例说明了窄转换可能导致的问题,并展示了如何启用编译器警告来捕获这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么时候引进的?

在带类的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的缩写)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值