最近。有一个项目开发,需要使用一次项目的代码。只有当项目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. 2019.08.18 日记--迁移微雪2.9寸电子墨水屏代码到Stm32F407上

    今天起晚了,大约吃了午饭开始干的活..... 主要完成了 微雪2.9寸电子墨水屏的代码迁移. 官方提供的代码是 基于STM32F103的,我对他进行了 代码的迁移,使之能运行在Stm32F407上.  ...

  2. 基于迁移学习的语义分割算法分享与代码复现

    摘要:语义分割的数据集是比较大的,因此训练的时候需要非常强大的硬件支持. 本文分享自华为云社区<[云驻共创]基于迁移学习的语义分割算法分享>,原文作者:启明. 此篇文章是分享两篇基于迁移学 ...

  3. 迁移学习后续——中草药分类(之简单学习代码编程过程)

    文章目录 特征提取代码 训练测试代码 全连接层模型保存代码 图片预测展示 简易迁移学习代码(万金油代码) 此代码是对上篇代码编写的一个简单的心路历程以及代码.模型,数据集与上篇一致没有变,这边用了五个 ...

  4. MFC:将工程从VC6.0工程升级到VS2017所遇到的代码不兼容问题集合

    一.errorC2440:消息相应函数类型不能转化 问题描述 VS2017编译提示以下两个问题: (1)errorC2440 "static_cast": 无法从"UIN ...

  5. 用C#实现win7下vs2008的激活(附学习交流代码)

    win7很好用,就是激活vs有点麻烦.当时为省事直接用虚拟光驱挂iso来装了,后来发现激活窗口却没有输入序列号的地方,就将就着用了.现在要过期了,真是烦人.其实输入框仅仅是隐藏了,升级按钮也是被隐藏起 ...

  6. VS2008 JS调试和Silverlight 后台代码调试 相互影响的问题。---自己做实例证明

    但是有几点要注意.首先,不能在同一调试过程中调试托管代码和脚本.(即XAML.cs 和JAVASCRIPT) 这就是说,如果在XAML的隐藏代码中设置一个断点,并且已经打开了Silverlight调试 ...

  7. libgc 加 .mak 在 vc6 vs2008 中的编译方法

    libgc 加 .mak 在 vc6 vs2008 中的编译方法 libgc 加 .make 在 vc6 vs2008 中的编译方法 开源代码多数是用 .mak 编译 win 平台,网上的教程多是说明 ...

  8. VC6代码移植VS2008的SDK总结,包括OPENGL和DireX还有Cimage 【总结】

    VS2008,VISTA系统 ------------------------------------------------------------------------------------- ...

  9. vs项目移植到linux运行,VS2008项目移植到Linux

    不少人都遇到过这种情况:在Windows下用Visual Studio工具开发的程序需要移植到Linux系统中,做成Linux版本的,但程序比较大,在Linux上又离不开Make,手动编写Makefi ...

最新文章

  1. java junit 运行_appium+java+junit demo运行
  2. window上安装mysql数据库
  3. jsp用session判断输入框_[实战小剧场servletamp;jsp] 用户登录及退出功能实现
  4. leetcode算法题--连续的子数组的和
  5. 内存容量出现异常的解决办法
  6. 关于axios请求报400如何获取报错信息
  7. 数据结构之树的存储结构
  8. rabbitmq 客户端golang实战
  9. 【Flume】举例分析如何配置Flume
  10. Jquery常用操作select篇
  11. 全网首发:GB18030制定者站出来,$为什么要显示为¥,给大家解释一下
  12. OpenCV-图像处理(11、形态学操作)
  13. Android 小游戏添加音效
  14. 上课笔记-机器学习(5)-美国人口普查数据进行收入预测分类
  15. 抖音快手如何上热门技巧IP定位让你离百万网红只差一步-阿甘电商
  16. 最详细的知识图谱的技术与应用
  17. C/C++ 使用信号量控制线程运行顺序
  18. PAT 1157 Anniversary
  19. 【Git的学习笔记】老板让我用Git提交,但我还没学过Git
  20. SpringBoot 实现 Office 各种格式在线预览(详细教程,包教包会)

热门文章

  1. ue4蓝图节点手册中文_在UE4中播放视频
  2. android系统的iphone,iPhone上安装Android系统详细步骤。
  3. android 添加头参数,Retrofit添加header参数的几种方法
  4. java mongodb存base64_阿里JAVA面试分享经验【文末有福利】
  5. spark编程基础--2.2scala基础知识
  6. 初始化Mysql系统报错,begin failesd--conpilation aborted at scripts........
  7. app、H5、safari、appstore应用主页评分页之间拉起调用、打开手机某些系统功能、app打开文档
  8. root 123 mysql_MySQL常用命令
  9. uni-app 音频控制
  10. 基于 CoreText 实现的高性能 UITableView