一个简单的移植性的问题
2002-08-13 09:17
701 查看
第一次发表文章,本人水平极其一般,所以这里写的可能没有多大价值,希望不会浪费各位的时间,如果是的话,我表示歉意。
看下面这段码:
//求字符串长度
int StrLen(const char str[])
{
for(int i=0;str[i]!='/0';++i)
{
continue;
}
return i;
}
这段代码在vc6.0环境下编译没有问题,可是在dev-c++下编译却是错误的,编译器提示为using obsolete binding at 'i',意思是使用的废弃的i。
原因很简单c++标准规定在循环内的局部变量在循环结束后,他的生命也就结束了,后续的对此变量的使用都是非法的。
时下有的编译器实现在某些方面未能符合c++标准,vc6.0就是这样的编译器。所以上面这段不符合c++标准的码,却能够顺利地通过编译,而不会有错误。
可以做一些简单的修改使之能够在不同的编译器下都能正确的通过编译:
int StrLen(const char str[])
{
int i;
for(i=0;str[i]!='/0';++i)
continue;
return i;
}
把变量i的定义声明提到循环前面就可以了。
由于时下的各种编译器并不能完全的符合c++标准,所以使一些不符合c++标准的码反而能够顺利的编译,在编译器能够完全符合c++标准以前,我们还有很长的一段路要走,也许会很黑暗,所以不要忘记使自己的码不要依赖于某一特定实现,从而对移植带来不必要的麻烦。
看下面这段码:
//求字符串长度
int StrLen(const char str[])
{
for(int i=0;str[i]!='/0';++i)
{
continue;
}
return i;
}
这段代码在vc6.0环境下编译没有问题,可是在dev-c++下编译却是错误的,编译器提示为using obsolete binding at 'i',意思是使用的废弃的i。
原因很简单c++标准规定在循环内的局部变量在循环结束后,他的生命也就结束了,后续的对此变量的使用都是非法的。
时下有的编译器实现在某些方面未能符合c++标准,vc6.0就是这样的编译器。所以上面这段不符合c++标准的码,却能够顺利地通过编译,而不会有错误。
可以做一些简单的修改使之能够在不同的编译器下都能正确的通过编译:
int StrLen(const char str[])
{
int i;
for(i=0;str[i]!='/0';++i)
continue;
return i;
}
把变量i的定义声明提到循环前面就可以了。
由于时下的各种编译器并不能完全的符合c++标准,所以使一些不符合c++标准的码反而能够顺利的编译,在编译器能够完全符合c++标准以前,我们还有很长的一段路要走,也许会很黑暗,所以不要忘记使自己的码不要依赖于某一特定实现,从而对移植带来不必要的麻烦。
相关文章推荐
- C++算法系列之日历生成的算法代码
- 输入输出流为什么要用缓冲区?
- 力争最简单把*、&说清楚
- Java 2 Micro Edition简介(二)
- Inside Java2 SDK Source Internal 深入Java2 SDK原始码(一) Java2 SDK原始码概观
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(四)
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(二)
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(一)
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(五)
- 让应用程序禁止Windows屏幕保护
- Microsoft Agent 学习笔记 (一)
- InstallShield简明使用教程
- boost::iterator_adaptor (III)
- boost::iterator_adaptor (I)
- boost::any
- 注释与反注释Comment/Uncomment selected code in Visual C++
- 《C++中的动态多维数组》