最近。有一个项目开发,需要使用一次项目的代码。只有当项目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几个问题——良好的代码,从我做起,从现在开始。的更多相关文章

  1. vs2008 怎么在Release下调试代码

    vs2008 怎么在Release下调试代码 (适用VS2005/VS2008) 在当前工程点击右键选择properties,选择 All Configurations C++>General- ...

  2. VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。

    近期,有个项目开发,须要用到曾经项目的代码,只是曾经项目都是VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功.以下总结一下我在一个VC6项目移植到VS2008中遇到的一 ...

  3. 编译Boost 详细步骤 适用 VC6 VS2003 VS2005 VS2008 VS2010

    vs2008编译boost [一.Boost库的介绍] Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库 ...

  4. vs2008中安装dev之后输入代码会输入代码段但是报错,可能解决方法

    vs2008工具栏DevExpress→Options 取消勾选这个

  5. VC6.0 中 添加/取消 块注释的Macro代码

    SAMPLE.DSM是微软提供的样例,使用的是vb语言.其中的 CommentOut 函数,是支持块注释的,可是这种/**/的注释方式,有时候用起来不是很方便,因为两个/会因为一个/而终止.对于大块代 ...

  6. 记录python2.7迁移到python3.6过程中的一些代码差异

    python2.7 python 3.6 import urllib2 import urllib import urlparse import urllib import exceptions 废弃 ...

  7. [摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)

    ============================================================================================= 201405 ...

  8. VC6.0代码移植到VS2008运行时乱码问题解决

    转载:http://blog.sina.com.cn/s/blog_6d0cbb030101a3cs.html 问题描述:     之前用VC6.0写过一个OpenGL的程序,后来需要将其放到VS20 ...

  9. visual studio R6034解决方案集 从VC6.0 或VC2003 到VC2005发现的问题

    这是我转的一篇非常全的帖子 能查到的解决方法都在里面有提及: 我是使用 stdafx.h加入这句 code #pragma comment(linker, "\"/manifest ...

随机推荐

  1. JVM调优总结(五)-分代垃圾回收详述1

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  2. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

  3. 基于visual Studio2013解决C语言竞赛题之0905文件读写显示

       题目

  4. boost::share_ptr用法

    boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr. 这其中,我最喜欢,使用最多的 ...

  5. ios内存管理2-对象之间的内存管理

    同之前一样,新建一个基于命令行的工程,在新建一个Student类和一个Book类 编写如下代码: Student.h // // Student.h // 内存管理2-对象之间的内存管理 // // ...

  6. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  7. wcf 出现 IsContentTypeSupported 错误

    查看添加的服务地址是不是https开头的,而 *.config 文件里面自动添加的链接变成了http,当前的bindbing类型为basicHttpBinding, 解决方法:在config文件里面手 ...

  8. @Autowired 注释与@Qualifier 注释

    @Service("OrganDaoIbatis") public class OrganDaoIbatis extends BaseDao implements IOrganDa ...

  9. Oracle 当前时间加减

     当我们用 select sysdate+number from dual ;我们得到的是,当前的时间加上number天后的时间.从这里我们也可以看出,使用这种方式进行时间计算的时候,计算的单位是天, ...

  10. 通过cmd命令到ftp上下载文件

    通过cmd命令到ftp上下载文件 点击"开始"菜单.然后输入"cmd"点"enter"键,出现cmd命令执行框 2 输入"ftp& ...