你曾在深夜痛哭过吗:从VC6.0平台级到VS2008平台(之三)
来源:百度文库 编辑:偶看新闻 时间:2024/05/11 21:21:32
从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
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
moto e398 从R372平台的99r刷到r373平台的42R
如何从windows操作平台切换到DOS
Macitosh平台是什么平台?
Macitosh平台是什么平台?
有没有免费的平台可以从电脑上发信息到手机上
从ATM到MSTP多业务传输平台有什么好处?又有什么风险?
QQ挂级平台服务器
Dreamweaver4.0平台试题汇编
去哪里可以下载到CS平台
如何下载到网站开发平台
QQ对战平台 的红色警报之共和国之辉
SONOMA平台
什么是平台
什么是平台?
什么是平台
平台是什么意思
lnfusioV2平台
对话平台
平台是什么意思
什么是平台
建筑设备平台
课件平台
手机平台
易游网娱平台