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++)
{
//...
}}
看起来很不雅观,但是这种改动却是”安全“
小结: ”先使程序能工作,让后对他们进行移植“ 是一个正常的思维定势,但软件到了开发后期在考虑移植会有许多意向不到的问题和导致更多的工作量。还不如事先略作规划。
- c++代码在不同编译器之间的移植的小故事 - 循环变量
- 不同编译器的故事一
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- 同一段代码,不同C编译器,输出结果真的会不同啊!!!
- 栈变量被覆盖的问题在不同编译器中的表现,蛋疼的VC++
- c99在不同编译器的实现情况
- 不同数据类型变量在不同CPU或MCU下的内存占用情况还与编译器或编译选项有关
- 【C++】关于变量在for循环内外定义的思考
- strcmp在不同系统/编译器下的结果不同
- C/C++的64位整型在不同编译器下的比较
- 不使用第三个变量交换两个变量的值,不同编译器的不同结果
- pro*c 里 DATE 变量的故事
- c语言for循环变量i,i的定义位置不同会导致错误
- Const指针与Const常量的在C编译器之间的匹配
- [ --> C Language<-- ] 不同的C编译器差别够大的
- Uboot在不同平台上的移植
- 清华申请退学博士作品:完全用Linux工作
- Oracle集群(RAC)及 jdbc 连接双机数据库
- c# 委托
- 关于架构
- 水文过程线(一)
- c++代码在不同编译器之间的移植的小故事 - 循环变量
- 在WindowsMobil系统中实现透明树组件
- Boost::Regex使用
- GCC-3.4.6源代码学习笔记(171)
- 为系统添加root用户密码
- Studying note of GCC-3.4.6 source (171)
- argus.py 可以仍是昔日素心悠游的少年
- MapReduce流程分析
- 上拉电阻下拉电阻的总结(转载经典)