VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。

news/2024/7/3 0:20:56

        最近。有一个项目开发,需要使用一次项目的代码。只有当项目VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功。以下总结一下我在一个VC6项目移植到VS2008中遇到的一些问题以及解决的方法。

 

1 类型转换

1WCHAR *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代码,一定要考虑跨平台编译的问题,vc6VS2008linux等。各种平台的编译器对代码的检查要求不一样,可是仅仅要遵守C++编写规范,这些问题都能够避免。而在写client代码的时候也要考虑这些。代码的可移植性、可读性都是代码质量非常重要的方面。

程序猿都不喜欢看别人的代码,改别人的代码,认为难看、难懂、难理解。可是自己在写代码的时候。又在给别人问候自己娘的机会。

    好的代码。从我做起,从如今做起。

 

 转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/26007423

 

 

 

版权声明:本文博客原创文章。博客,未经同意,不得转载。


http://lihuaxi.xjx100.cn/news/246285.html

相关文章

F# 4.5提供Spans、Match!等特性

F# 4.5预览版现已发布&#xff0c;其中提供了一系列新特性&#xff0c;包括对.NET Core 2.1的新原生类型Span\u0026lt;T\u0026gt;的支持、新关键字Match!等。\\类型Span意在实现底层代码指针操作的安全性和可预测性&#xff0c;这可使得很多情况下不必再分配内存&#xff0c;进…

C++关键字decltype

1. decltype简介 decltype与auto关键字一样&#xff0c;用于进行编译时类型推导&#xff0c;不过它与auto还是有一些区别的。decltype的类型推导并不是像auto一样是从变量声明的初始化表达式获得变量的类型&#xff0c;而是总是以一个普通表达式作为参数&#xff0c;返回该表达…

求几亿个数中不重复元素的个数

题目&#xff1a; 有2.5亿个无符号整数&#xff08;但在文件里面&#xff09;&#xff0c;要求找出这2.5亿个数字里面&#xff0c;不重复的数字的个数&#xff08;那些只出现一次的数字的数目&#xff09;&#xff1b;另外&#xff0c;可用的内存限定为600M&#xff1b;要求算法…

android sqlite操作(2)

以下只是我个人的浅见,大神请忽略~ 这一篇说一下sqlite的相关操作,其实安卓提供了相当多的操作sqlite的方法,这里我介绍下我常用的方法。 (1)创建一个数据库文件,这个很简单 1 File dbPathFile new File(dbPath); 2 if(!dbPathFile.exists()) 3 try { 4 dbPathFil…

C++关键字const与constexpr

1. const 1.1. 修饰一般常量 一般常量是指简单类型的常量。这种常量在定义时&#xff0c;修饰符const可以用在类型说明符前&#xff0c;也可以用在类型说明符后。 例如&#xff1a; int const x 2; const int y 2; const std::string& name "csdn"; 1.2…

RNN,LSTM,GRU简单图解:

一篇经典的讲解RNN的&#xff0c;大部分网络图都来源于此&#xff1a;http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 每一层每一时刻的输入输出&#xff1a;https://www.cnblogs.com/lovychen/p/9368390.html 带有权重标识的图&#xff1a;

javascript里面RegExp的exec函数的总结

2019独角兽企业重金招聘Python工程师标准>>> 在我们的前端里面&#xff0c;经常会用到正则表达式进行检索字符串&#xff0c;刚好javascript里面提供RegExp来支持正则表达式&#xff0c;而RegExp对象的主要方法是exec()。 语法 RegExpObject.exec(string) 参数 描述…

详解zabbix中文版安装部署

一、zabbix简介&#xff08;摘自百度百科&#xff09;zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供柔软的通知机制以让系统管理员快速定位/解决存在…