一点忙也帮不上的编译器

前几天,我写了一些关于SOCKET小函数,并按照WinSock API的风格,用一个int型来做为函数的返回值,NO_ERROR(零)表示操作成功,其他值表示错误代码,用了一段时间后,发觉这个风格与我(以及其他同事)的很多其他代码风格不相符,更多的时候,大家是用bool值来做为函数的返回值,true表示成功,false表示失败,所以,我打算改动一下,将函数的返回值由int改成bool。
改动工作很顺利,并且我很高兴地发现,以前的其他代码(几乎)不用做任何修改就能通过编译……遗憾的是,以前有很多地方是按下面的风格写的:
/* 注意下面这句:
一个bool的函数返回值可以被赋值给一个整型变量,
而VC7却没有任何警告*/

int err = foo();
if (NOERROR==err)
cout << "OK" << endl;
else
cout << "Error: #" << err << endl;
逻辑完全变了,表示执行失败的false被做为整数0赋值给变量err,然后让NOERROR==err这个判断成立,完全按照原来的相反方向在进行着……反过来说,如果一个函数原来的返回值是布尔型的,那么我们通常会用 if (foo()) 这样的语句,如果将返回值改成整型或指针,那么编译器根本不会在使用这些函数的地方报错,也就是说,要保证重构的完全成功,编译器一点忙也帮不上。
参考以下代码,在VC7和BC5这两个编译器里,均不会有任何警告:
#include <iostream>
using namespace std;

bool foo() {
int varInt_1 = true; //将布尔常量赋值给整型变量
bool varBool_1 = 1; //整型常量赋值给布尔变量
int varInt_2 = varBool_1; //布尔变量赋值给整型常量
int varInt_3 = varBool_1 + varBool_1; //布尔值相加后赋值给整型变量
cout << varInt_2 << ',' << varInt_3 << endl;
if (varBool_1 && varInt_1) //对布尔型和整型均可以进行布尔判断
return 1; //明明是返回布尔型的函数,却可以返回整型
else
return 0;
}
int main(int , char **) {
return foo(); //可以返回一个布尔值来取代整型返回值
}
由于编译器一点忙也帮不上,所以再次证明了,测试代码对于重构来说,是多么的重要!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值