你曾在深夜痛哭过吗:从VC6.0平台级到VS2008平台(之三)

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 06:03:51
从VC6.0平台级到VS2008平台(之三) 收藏
6、新的C++编译器不再支持默认类型的变量定义
错误现象是:
f:\project\.....\WzCheckBox.cpp(464) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int产生这个错误的原因是程序中出现了这样的代码:const some_const_var = 10;或static some_static_bool = FALSE;新的C++编译器严格按照C++标准,不再支持默认类型的变量定义方式,必须严格指定变量类型,如下使用:const int some_const_var = 10;或static BOOL some_static_bool = FALSE;
7、for 语句的变量作用域问题    考察下面的代码:for(int i = 0; i < 120; i++)
{
    if(something_happen)
    {
         break;
    }
.............
}if(i < 120)
{
    //something happen
}在VC6的编译器中,这样的代码是没有问题的,因为VC6的编译器为了兼容旧的Microsoft C/C++编译器,没有严格按照C++标准执行,但是从VC7开始,VC的编译器开始遵守C++标准,所以就会出现“变量i没有定义的错误”。解决的方法也很简单,按照Jim Hyslop 和 Herb Sutter的经典对话系列的第四篇中的方法,改成如下就可以了:int i;
for(i = 0; i < 120; i++)
8、字符串函数的返回值问题
    strchr(_tcschr)、strpbrk(_tcspbrk ??)、strrchr(_tcsrchr)和strstr(_tcsstr)这四个函数在VC6的CRT库中定义的返回值都是char *(TCHAR *),所以以前的代码通常是这样使用的:TCHAR *cp = _tcschr( pszPath, _T('\\') );
//使用*cp,可以通过cp指针修改pszPath的内容这其实是一个“漏洞”,因为如果pszPath是const char(TCHAR) *字符串,那么就表示它不希望修改字符串的内容,但是调用strchr(_tcschr)函数后就可以通过cp指针修改其内容了,这岂不荒谬?所有在新版本的CRT库中,这几个函数的返回值都改成const char *,这就会导致上面的代码产生编译错误。建议的修改方式是改成如下方式:const TCHAR *cp = _tcschr( pszPath, _T('\\') );
//不能再通过cp指针修改pszPath的内容但是这样修改可能对代码的影响比较大,比如下面的代码:
TCHAR buf[256]; //局部缓冲区
......
TCHAR *cp = _tcschr( buf, _T('\\') );
//作为局部缓冲区(非const),希望通过cp修改buf的内容这种情况怎么办呢?对了,C++还有个const_cast操作符,这时就可以排上用场了:TCHAR *cp = const_char(_tcschr( buf, _T('\\') ));不过上面的方法要慎用,除非确定buf是非const的,否则最好老老实实地修改代码。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangbinjn/archive/2009/09/04/4516794.aspx