VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。
近期,有个项目开发,须要用到曾经项目的代码,只是曾经项目都是VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功。以下总结一下我在一个VC6项目移植到VS2008中遇到的一些问题以及解决的方法。
1
类型转换
1)WCHAR *wszFind = wcschr( wszText,(WCHAR)'@');
这个代码在VC6下编译是没问题的,但在VS2008下,编译会报错,就是类型转换的问题,改动例如以下:
WCHAR *wszFind = (WCHAR *)wcschr( wszText,(WCHAR)'@');
2)
1)
int ConvertAnsiToUnicode16(const CHAR * szIn,CHARU16 *szOut,int nSize )
以下在VS2008编译不通过,
nLen = ConvertAnsiToUnicode( szIn,szOut,nSize );
例如以下改动能够:
nLen = ConvertAnsiToUnicode( szIn, (WCHAR *)szOut,nSize );
就是说VS2008,对代码的要求更严格,会对类型做检測,不会支持默认的类型强制转换。
2 DWORD dwPower = (DWORD)(pow(2.0f,(double)m_dwArraySize ));
编译提演示样例如以下:
XXX.cpp(58) : error C2666:“pow”: 6个重载有相似的转换
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(575):可能是“long double pow(long double,int)”
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(573):或
“long double pow(long double,long double)”
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(527):或
“float pow(float,int)”
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(525):或
“float pow(float,float)”
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(489):或
“double pow(double,int)”
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(123):或
“double pow(double,double)”
这个就是重载函数的问题。
能够例如以下:
方法一:
UINT nRes = (UINT)pow( (double)10.0f,(double)(m_nListCount-1) )*nMinRes;
方法二:
Double dValue = 10.0f
UINT nRes = (UINT)pow(dValue ,(double)(m_nListCount-1) )*nMinRes;
3 const BUFLEN = 26*4;
VS2008编译提示:
error C4430:缺少类型说明符 -
假定为 int。注意: C++不支持默认 int
改动例如以下:
const int BUFLEN = 26*4;
4
作用域
for (int i = n; i < n + 16; i++)
{
m_bySeed[i % sizeof(m_bySeed)] ^= by16[i];
}
m_nUpdateCounter++;
if (0 == (m_nUpdateCounter % 1024))
{
SaveSeedIntoFile();
}
for (i = 0; i < sizeof(m_bySeed); i++)
{
m_bySeed[i] ^= rand() % 0xff;
}
上面代码在VS2008,会提示i未定义,这个就会作用域的问题。
改动例如以下:
int i;
for (i = n; i < n + 16; i++)
{
m_bySeed[i % sizeof(m_bySeed)] ^= by16[i];
}
m_nUpdateCounter++;
if (0 == (m_nUpdateCounter % 1024))
{
SaveSeedIntoFile();
}
for (i = 0; i < sizeof(m_bySeed); i++)
{
m_bySeed[i] ^= rand() % 0xff;
}
5
宏定义
typedef enum _STORAGE_QUERY_TYPE {
PropertyStandardQuery = 0, // Retrieves the descriptor
PropertyExistsQuery, // Used to test whether the descriptor is supported
PropertyMaskQuery, // Used to retrieve a mask of writeable fields in the descriptor
PropertyQueryMaxDefined // use to validate the value
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
VS2008下编译提示与系统反复,所以在宏定义的时候,一定要添加与自己project功能相关的keyword,用来差别。
6
抛异常
例如以下
if(keysize<1)
throw exception("Incorrect key length");
这样的代码在VC6下能够编译,在VS2008编译只是,解决的方法直接屏蔽。
总结:
上面提到的问题,事实上大部分是一个编写习惯的问题。在写server代码,一定要考虑跨平台编译的问题,vc6、VS2008、linux等。各种平台的编译器对代码的检查要求不一样,可是仅仅要遵守C++编写规范,这些问题都能够避免。而在写client代码的时候也要考虑这些,代码的可移植性、可读性都是代码质量非常重要的方面。程序猿都不喜欢看别人的代码,改别人的代码,认为难看、难懂、难理解。可是自己在写代码的时候,又在给别人问候自己娘的机会。
好的代码,从我做起,从如今做起。
转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/26007423
VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。的更多相关文章
- [摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)
============================================================================================= 201405 ...
- VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。
最近.有一个项目开发,需要使用一次项目的代码.只有当项目VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功.以下总结一下我在一个VC6项目移植到VS2008中遇到的一些问 ...
- VC6.0代码移植到VS2008运行时乱码问题解决
转载:http://blog.sina.com.cn/s/blog_6d0cbb030101a3cs.html 问题描述: 之前用VC6.0写过一个OpenGL的程序,后来需要将其放到VS20 ...
- JSP myecplise项目移植到ecplise
把myecplise项目移植到ecplise的一些细节: 参考于http://www.cnblogs.com/liushuijinger/p/3396063.html 因为个人需要,需要把JSP项目从 ...
- VS2008项目移植到Linux
不少人都遇到过这种情况:在Windows下用Visual Studio工具开发的程序需要移植到Linux系统中,做成Linux版本的,但程序比较大,在Linux上又离不开Make,手动编写Makefi ...
- Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解
作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...
- Cocos2d-x项目移植到WinRT/Win8小记
Cocos2d-x项目移植到WinRT/Win8小记 作者: K.C. 日期: 11/17/2013 Date: 2013-11-17 23:33 Title: Cocos2d-x项目移植到WinRT ...
- Cocos2d-x项目移植到WP8小记
Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ...
- CocoaPods管理的项目移植到别人电脑后找不到头文件
CocoaPods管理的项目移植到别人电脑后找不到头文件 在TARGETS -> Search Paths -> User Header Search Paths 中 写入 ${SRCRO ...
随机推荐
- python everything is object
python面向对象非常彻底,即使过程式的代码风格,python在运作的时候也是面向对象的.everything is object. 差异 在面向对象的理念上,python和非常工程化的面向对象语言 ...
- Linux mail 命令使用
linux mail 命令参数: 使用mail发邮件时,必须先将sendmail服务启动. mail –s “邮件主题” –c”抄送地址” –b “密送地址” -- -f 发送人邮件地址 –F 发件人 ...
- 批处理文件安装与卸载Windows服务
//安装Windows服务 将RECPost.exe和RECPostService替换成自己的项目名称和服务名称,并将文件保存成bat格式.其中%cd%是获取相对路径 @echo off set fi ...
- MyBatis Generator自动生成MyBatis的映射代码
MyBatis Generator大大简化了MyBatis的数据库的代码编写,有了一个配置文件,就可以直接根据表映射成实体类.Dao类和xml映射.资源地址:MyBatis项目地址:http://my ...
- utf8汉字编码16进制对照
utf8汉字编码16进制对照 GB Unicode UTF-8 Chinese Character Code code# Code (coded in UT ...
- 判断JS类型
(function (root, factory) { if (typeof define === 'function' && define.amd) { define([], fac ...
- Java线程运行轨迹-代码追踪与定位
今天在写程序时,想到一个问题,当我的程序出异常的时候,控制台输出信息中,明确指出了出现异常的位置,并详细列举了函数的调用层次关系,它是怎么做到的. 竟然想到了这个问题,就去查看了源代码,不过没点几下, ...
- Python自动化运维之26、Web框架本质、MVC与MTV
一.Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:ut ...
- SQL Server 2008无日志文件附加数据库
1.新建一个同名数据库. 2.停止数据库服务,覆盖新建的数据库主文件(小技巧:最好放在同一个磁盘里面,把新建的数据库主文件删掉或移开,再把要恢复的数据库主文件剪切过去,这样就可以节省时间.) 3.启动 ...
- Jcrop 做图片剪裁 在IE中无法显示问题解决办法
我遇到的Jcrop做剪裁无法显示的问题 是在IE8下发生的(在 firfox he chrome 中是显示正常的) 解决办法 是在一个图片加载完成后在 初始化 Jcrop:1.预加载图片的方法 var ...