分享

从VC6.0平台级到VS2008平台(之三)

 Daisycv 2010-10-31
从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<TCHAR *>(_tcschr( buf, _T('\\') ));
不过上面的方法要慎用,除非确定buf是非const的,否则最好老老实实地修改代码。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangbinjn/archive/2009/09/04/4516794.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多