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几个问题——良好的代码,从我做起,从现在开始。的更多相关文章
- vs2008 怎么在Release下调试代码
vs2008 怎么在Release下调试代码 (适用VS2005/VS2008) 在当前工程点击右键选择properties,选择 All Configurations C++>General- ...
- VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。
近期,有个项目开发,须要用到曾经项目的代码,只是曾经项目都是VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功.以下总结一下我在一个VC6项目移植到VS2008中遇到的一 ...
- 编译Boost 详细步骤 适用 VC6 VS2003 VS2005 VS2008 VS2010
vs2008编译boost [一.Boost库的介绍] Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库 ...
- vs2008中安装dev之后输入代码会输入代码段但是报错,可能解决方法
vs2008工具栏DevExpress→Options 取消勾选这个
- VC6.0 中 添加/取消 块注释的Macro代码
SAMPLE.DSM是微软提供的样例,使用的是vb语言.其中的 CommentOut 函数,是支持块注释的,可是这种/**/的注释方式,有时候用起来不是很方便,因为两个/会因为一个/而终止.对于大块代 ...
- 记录python2.7迁移到python3.6过程中的一些代码差异
python2.7 python 3.6 import urllib2 import urllib import urlparse import urllib import exceptions 废弃 ...
- [摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)
============================================================================================= 201405 ...
- VC6.0代码移植到VS2008运行时乱码问题解决
转载:http://blog.sina.com.cn/s/blog_6d0cbb030101a3cs.html 问题描述: 之前用VC6.0写过一个OpenGL的程序,后来需要将其放到VS20 ...
- visual studio R6034解决方案集 从VC6.0 或VC2003 到VC2005发现的问题
这是我转的一篇非常全的帖子 能查到的解决方法都在里面有提及: 我是使用 stdafx.h加入这句 code #pragma comment(linker, "\"/manifest ...
随机推荐
- 运行复制的ZooKeeper 部署
运行复制的ZooKeeper 运行ZooKeeper 在一个独立模式下是方便评估的, 一些开发,和测试. 但是在生产,你应该运行ZooKeeper 在复制模式.一个复制的servers group 在 ...
- 高级特性(8)- JavaBean构件
8.1 为何使用Bean8.2 编写Bean的过程8.3 使用Bean构造应用程序 8.3.1 将Bean打包成JAR文件 8.3.2 在开发环境中组合Bean8.4 Bean属性与事件的命名模式8. ...
- cocos2d-x游戏开发系列教程-坦克大战游戏之敌方坦克AI的编写
在上篇我们完成了子弹和地图碰撞的检测,在这篇我们将完成敌方坦克AI的编写. 具体思路是屏幕中保持有四个敌方坦克,然后坦克随机方向运动,并且子弹消失后1秒发射一次 1.我们新建一个敌方坦克的AI类来控制 ...
- H3C HCSE 官方培训胶片(中文) 下载
H3C HCSE 官方培训胶片(中文) 点击文件名下载 HM-040 OSPF路由协议(V5.1).ppt HM-041 BGP协议原理及配置(V5.0).ppt HM-041 BGP协议原理及配置( ...
- Java返回类型泛型的用法小结
Java返回类型泛型的用法小结 版权声明:本文为博主原创文章,未经博主允许不得转载. 关于Java泛型的基本用法就不多说了,主要是一个编译期的检查,也避免了我们代码中的强制转换,比较经典的用法有泛型D ...
- boost uuid 学习笔记
#include <vector>#include <iostream>#include <boost/uuid/uuid.hpp>#include <boo ...
- java假设模拟请求重新启动路由器(网络爬虫经常使用),还有java怎样下载图片
我们假设在公司或家里使用网络爬虫去抓取自己索要的一些数据的时候,经常对方的站点有defence机制,会给你的http请求返回500错误,仅仅要是同样IP就请求不到数据,这时候我们仅仅能去重新启动路由器 ...
- Qt布局管理
原地址:http://blog.csdn.net/lastsoup/article/details/7028243 设计软件中各个部件的位置排列,有两种方法: 1.设置widget的在父窗体中的坐标和 ...
- ajax表单提交全路径
//ajax提交form表单的方式 $(document).ready(function() { $('#shopping-submit').click(function() { alert(&quo ...
- QT---系统托盘图标不显示原因
很久没用QT写UI相关的东西了,有些东西都忘记了,今天竟然忘记了系统托盘图标是怎么显示的了.下面说下解决方法 1.现象, 设置了QSystemTrayIcon的Icon图标,但就是不显示自己设置的图片 ...