C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

升级VC7项目到VC8的注意事项(转)

   

 

升级VC7项目到VC8的注意事项

在2005年年中的时候,公司就准备转移到Visual Studio 2005上开发产品。本人有幸参与了升级的过程,成功的把30个左右solutions、几百个projects升级到了VC8。由于项目众多,并且项目还在持续开发中,我们的基本策略是让代码同时在VC7.1和VC8下面编译通过,最后再完全转到VC8,链接并运行成功。从总体上说VC8比VC7.1语法上严格且严谨。下面是我的一些经验总结。文中只涉及到编译问题,链接的问题没有包含在内。我的同事Mr Han对此文有巨大贡献,在此非常感谢。
1. 变量作用域
在vc7.1中, 如果一个变量定义在for语句的条件从句中,那么这个变量可以在for之后使用。但Vc8禁止这样,会报告一个C2065错误.

for  ( int  i  =   0 ; i  <   10 ++ i)  
{                             
   
// codes here
}

if  (i  <   10 )..  // error in Vc8
for  (i  =   0 ; i  <   5 ++ i)  // error in Vc8

解决方法:
在for语句之前声明变量(可保证代码在vc7.1和vc8下同时编译通过)

int  i  = 0 ;                    
for  (i  =   0 ; i  <   10 ++ i)
for  (i  =   0 ; i  <   5 ++ i)

2. 指针和引用的声明
在Vc7.1中, 下面的代码可以编译, 但是vc8会报C4430 错误。(很难想象有些美国程序员竟然这样声明)

const   &   int  a;  // error in VC8
const   *   int  b;   // error in VC8
int  myfun ( const   &  B);  // error in VC8

解决方法:
把* 或&放到类型的后面.

const   int &  a; 
const   int *  b;
int  myfun ( const  B & );

3. 默认int类型
在vc7.1中,如果定义一个变量但不声明类型,那么默认为int。VC8不支持。

static  i  =   0 //  C4430 error in Vc8 
const  i  =   0 // C4430 error

解决方法:
加上int.

static   int  i  =   0
const   int  i  =   0 ;

4. 函数的默认返回值类型
同上,VC8不支持把 int 作为默认返回值类

Func()
{ return   0 ;} // error in VC8

解决方法:
明确声明函数返回值类型为 int.

int  Func()
{ return   0 ;} ;

5. 函数地址
Vc7中函数名就是地址。在vc8中,必须要使用&操作符同时写出这个方法的全名(fully qualified name).

class  A
{
public :
     
int  Test( void );
}
;
void  fun( int  (A:: * test) ( void ));
int  main() 
{
     fun(A::Test);
// C3867 error in VC
      return   0 ;
}

解决方法:
加上 &.

fun( & A::Test);

6. 隐式类型转换
VC8不允许B* 到const B*&的隐式转换.

class  B {} ;
void  fun (  const  B *   &  ); // if possible use const B* instead
int  main() 
{
* test  =   new  B();
fun (test); 
// error in VC8
return   0 ;
}

解决方法:
强制转换或函数参数变成const B*。

void  fun (  const  B *   );

7. 友元方法(Friend function)
VC8不允许声明一个private或protected函数为友元.

class  A
{
private :
 
void  c();  
}
;
class  B
{
  friend 
void  A::c();  // C2248 error, c() is invisible to class B.
}
;

解决方法 1:
声明友元类.

class  A
{
private :
 
void  c();  
}
;
class  B
{
  friend 
class  A;
}
;

解决方法 2:
把函数声明为public

class  A
{
public :
 
void  c();  
}
;
class  B
{
  friend 
void  A::c();
}
;

8. STL的stdext 命名空间
在vc8中,hash_map 和hash_set 被移进了stdext命名空间中.

#include  < hash_map >
std::hash_map 
// error in VC8

解决方法:
使用stdext 命名空间.

#include  < hash_map >
stdext::hash_map

9. 头文件
许多头文件如fstream.h 和iostream.h在VC8中已经不存在了.

#include  < fstream.h >   // error in VC8

解决方法:
使用STL.

#include  < fstream >

10. Iterator
一些 STL 类, iterators 不再用指针实现

std::vector < DMDetailRow >  m_data;
std::vector
< DMDetailRow > ::iterator iter  =   & m_data[rowNum];

解决方法:

std::vector < DMDetailRow > ::iterator Iter  =  m_data.begin()  +  rowNum;

11. Enum
使用一个Enum的成员时,不要使用enum的名字

enum  E
{
  a,b,c
}
;
E e1 
=  E::a;  // warning in VC8

解决方法:
去掉Enum 的名字.

E e1  =  a;

 


 



 
 

posted on 2006-07-24 08:47 梦在天涯 阅读(961) 评论(0)  编辑 收藏 引用 所属分类: CPlusPlusVS2005/2008


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1796271
  • 排名 - 5

最新评论

阅读排行榜