作者:谢启东编译
Microsoft Visual C++ 2005是微软公司Visual Studio 2005开发套件中的一出重头戏,与前一个版本相比,其革新性的集成开发环境与C++编译器,带来了有许多改变。在本文中,主要讲解程序员在升级程序时,可能会遇到的一些不同之处及变化,而这些变化很可能会使老一点的程序不能通过编译。总之,这些变化绝不是偶然发生的,其背后都有强大的理论依据在支撑,所以,使用Visual C++的
程序员,在升级之前,一定要弄清楚这些变化。
Visual C++中已经发生的变化
微软Visual C++工作小组在对其产品作出修改之前,已经过充分的考虑,同时也顾及到了这些改变会对以前的代码造成的影响,虽然如此,但有以下理由支持在新版本中作出的这些改变:
Visual C++ 2005其中一个最重要之处,就是更加遵循ISO C++标准,可更好地跨平台移植代码,或集成进其他工具中,如声明在for循环中的变量生命期及变量类型现在也遵循C++标准了;而且,在默认设置中,就是遵循ISO C++标准的。正是因为此,在一些老代码中,过去可行的一些方法,现在可能要作出必要的修改,才能通过编译了。
在这几年中,安全性是一个热门的话题,而且在将来也会得来越来越多的重视。C++语言赋于了
程序员无所不能的能力,但凡事总有两面性;为减少代码中的安全
问题,也为减少代码中错误产生的可能性,Visual C++ 2005作出了一系列的改变,首先,引入了安全CRT及不推荐使用的非安全API等概念,而且在默认状态下,Visual C++ 2005也会进行代码安全检查。
Visual C++ 2005增强了适用性,这也使得可更方便地升级本身的二进制代码成为可能,而且,也更加容易进行产品的漏洞修补。
可维护性也是一个促进Visual C++变化的原因之一,例如,低价值的功能已经从产品中消失,以减少在将来维护它们的可能性。一个例子就是,Visual Studio 2005中已经移除了单线程CRT,因为已经不再需要它了,以前为维护单线程CRT所花费的时间,现在可以用在更重要的事情上了。
最后,其中的某些变化,是为了增强Visual C++编译器的可靠性,为达此目的,微软公司此次保证了Visual C++中有明确定义并一致的行为。
当然,也要避免某些变化,此次Visual C++的大多数变化都是在代码安全层面上,如果这些变化向后影响到二进制代码的兼容性,那么就会尽量避免,因为源代码兼容性总是在二进制代码兼容性之前被发现的。另外,如果某些变化致使人们不想采用或升级到2005版,那么这种变化也要避免,因为这会导致软件项目的总成本增加。最后,编写代码方式的改变也要在成本上证明是值得的,否则,就没有必要去实现它了。
Visual C++库的十项突破性变化
Visual C++ 2005库已经发生了一系列的变化,可能会对现有的程序有所影响,在升级到Visual C++ 2005之前,必须要确定
程序中没有这些问题。
1、参数的有效性
在C运行时库中,加入了一些代码,以检查参数的有效性。例如:如果传递的目标缓冲区大小不足以strcpy使用--通常这是在冒安全风险,而新版本此时则会调用一个非法参数处理程序。在release版中,会调用Dr.Watson;而在debug版中,会产生断言(assert),当然,只要
程序中传递的参数都是有效的,就不会有什么问题了。
2、对非安全API的警告
在Visual C++ 2005中,CRT中的一组函数已不再建议使用,而应使用新提供的安全版本。大多数这些不建议使用的函数如果使用不当,将会导致缓冲区溢出或其他安全问题,这些函数如:strcpy、strcat等等。这些函数新的安全版本都在函数名后加了一个_s后缀,以方便识别,如strcpy_s、wcscpy_s、mbscpy_s、calloc_s和strcat_s这些函数。
如果想继续使用老版本、非安全的函数,可在源