Vc2005出来有一段时间了.其特性确实与之前的版本有些差异.同样的程序在2005下就可能有问题.以下是发现的一些问题:
(1)对于const和static类型的常量或变量,在声明时需要指定适当的数据类型,如果不指定不再提供默认类型
(2) 在使用使用std命名空间库函数的时候,会出现如下的警告,
warning C4996: strcpy was declared deprecated
这是因为Vs2005中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、strcat等。
在编译选项中增加宏
_CRT_SECURE_NO_DEPRECATE
可以忽略这些警告,但是
Vs2005
提供了这些函数的更高级别安全版本,后面加了一个
_s
的函数,如
strcpy_s
等,建议使用
TCHAR,
及相关的字符串拷贝函数,如:
_tcscpy_s
、
_stprintf_s
(
2005
下加后面的
_s
)等
(3)在vc2005中,time_t从32位变成64位。在将一个非time_t数据赋值给一个time_t时,请将非time_t数据转换为time_t,然后再赋值;将time_t转换为整形数据时,请选用LONGLONG
(4) 对于const和非const常量的转换时,根据具体情况确定,推荐将两者转换为const类型
(5)提示:
C:/program files/microsoft visual studio 8/vc/include/xiosbase(104) : error C2065: '_SH_DENYNO' : undeclared identifier.原因是xiosbase文件中包含的头文件share.h与工程文件中的文件重名,导致xiobase加载的是工程文件中share.h,解决方法是修改工程中的share文件名
C:/program files/microsoft visual studio 8/vc/include/xiosbase(104) : error C2065: '_SH_DENYNO' : undeclared identifier.原因是xiosbase文件中包含的头文件share.h与工程文件中的文件重名,导致xiobase加载的是工程文件中share.h,解决方法是修改工程中的share文件名
(6)标准库的C++头文件名中的.h被去掉,如<iostream.h>变成了<iostream>,对于 C头文件,采用同样的方法,但在每个名字前要添加一个 c,如<string.h>变成了<cstring>。
(7)如果找不到MFC的头文件,将在VS2005安装目录下搜索该文件,找到后将路径添加到TOOL->Options…->Projects and Solutions->VC++ directories中
(8)在编译资源的时候,如果编译器报告:资源中的ID号与系统ID冲突(至少从6.0到2005转换,发现有),请修改相应的资源ID号。
(9) 将无符号数据转换为数据范围更大的有符号数据时,请人工将无符号数据转换为有符号数据,不要让系统默认处理.
Unsigned int b = 10;
_int64 a = (int)b;
如文件操作:使用CFile::Seek函数,
在VC6中函数形式为:LONG Seek( LONG lOff, UINT nFrom );
在VC8中为LONGLONG Seek( LONGLONG lOff, UINT nFrom );
代码中有些地方是这样使用的Seek(--sizeof(xxxx) , CFile::current);
Sizeof的返回是一个unsigned int,如上使用会发生比较严重的问题:lOff的高4个字节不会转换为有符号数据,类似0x00000000xxxxxxxx,正确的形式为:0xffffffffxxxxxxxx
请在sizeof前面使用强制转换:(int)sizeof
或先将其转换为
__int64,
然后在进行其他处理
(10)对于MFC函数或C运行时库函数,在VS2005中可能发生变化,请根据MSDN选择合适的函数形式