c++代码在不同编译器之间的移植的小故事 - 循环变量

来源:互联网 发布:网络教育英语统考试题 编辑:程序博客网 时间:2024/06/05 04:50

刚开始工作的时候,加入到一个c++开发小组。当时整个项目组的任务是把VC下面的代码移植到Linux下面。在修改好了makefile文件之后,我80%的时间是在处理一个很简单的问题: 修改循环变量。在2000年左右,VC6是当时用得最多的c++编译器。但是VC6有很多不兼容的一些问题。很多在gcc下面能成功编译的代码,到了vc6下面会报一堆错误。 最麻烦的莫过如此如下一段代码:

for(int i=0; i<a.size(); i++)

{//…

};

for(int i=0; i<b.size(); i++)

{//…

}

如果是今年,这段代码在几乎所有的编译器上都没有问题。但是在VC6上,编译器认为变量i被重复定义了。这可是个大麻烦,因为当时整个系统的代码量达到了十万多行。 另外,代码是很多前辈修修改改的杰作, 到了我“这一代”,估计已经没有人完全能读懂所有的代码了。 这样,修改就变成一件非常细心的事情。当然,改动起来也很容易,最简单的方案就是把循环变量提出来,一了百了。

int i;
for(i=0; i<a.size(); i++)
{//…
};
for(i=0; i<b.size(); i++)
{//…
}

看起来小菜一碟,这个问题得到解决. 不过,碰到了某个函数里面i已经作为了一个局部变量的时候,容易出大问题。

例如

int i =0;
for(i=0, i<a,size(); i++) //原来的是for(int i=0
{ //...
}
//... 很多行以后
while(isValid(b[i]) i++;
Output(i);

显然,i的输出会变得大不一样。早期的c编译器, 要求把变量的声明放在函数开始的地方。这位程序员用惯了古老的c编译器,早早就定义了i, 如果按照原有代码,for循环不会对之前定义的局部变量i造成影响。运行也不会有什么问题。 但为了移植到windows, 去迎合VC6编译器的这个缺陷。 一个不严谨的改动导致了意想不到的问题问题。 这个模块是为了一个电信计费系统用的,一点错也容不得。幸运的是,改完之后的回归测试发现了这个问题,不然会酿成大祸。当然,也有更安全的方案去解决这个问题,那就是在每个for循环外面在加上一对{}. 就像这样

{for (int i=0; i<a.size(); i++)
{
//...
}}

看起来很不雅观,但是这种改动却是”安全“

 

小结: ”先使程序能工作,让后对他们进行移植“ 是一个正常的思维定势,但软件到了开发后期在考虑移植会有许多意向不到的问题和导致更多的工作量。还不如事先略作规划。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 什么显示器性价比高 什么手机性价比较高 便宜性价比高的手机 性价比高的车排行榜 那款笔记本性价比高 性价比超高的笔记本 哪种护肤品性价比高 性价比高的手机有哪些 有哪些性价比高的手机 笔记本那款性价比高 哪种纸尿裤性价比高 标致哪款车性价比高 1000性价比高的手机 行车记录仪性价比高的品牌 现在性价比比较高的手机 性价比高的紧凑型suv排行榜 性价比高的平板推荐 性比价是什么意思 性价 哪个牌子的表性价比高 什么马桶好用性价比高 电脑哪个牌子性价比高 婴儿推车哪个性价比高 哪个牌子电脑性价比高 三星哪款手机性价比高 现在那些手机性价比高 哪个品牌空调性价比高 哪个牌子的拉杆箱性价比高 瓷砖哪个牌子的性价比比较好 什么牌子的羽毛球拍性价比高 什么牌子的蓝牙耳机性价比高 男士钱包什么牌子性价比高 抽油烟机哪个牌子性价比高 液晶电视什么牌子性价比高 哪个牌子的油烟机性价比高 森海塞尔哪款耳机性价比高 哪个牌子的平板性价比高 蓝牙耳机什么牌子性价比高 什么牌子的充电宝性价比高 哪个牌子的按摩椅性价比高 机械键盘什么牌子性价比高