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

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() 
 {
B  * 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;

时间: 2024-11-03 01:21:04

升级VC7项目到VC8的注意事项的相关文章

网站改版分析:阿里资讯站升级的项目总结

序: 2年前,刚入职阿里还没转正就有幸参与了资讯改版项目,那可是我的产品处女秀,出演视觉设计师一角,当时拿到手的就已经是一份未上色的黑白稿以及一份飞机稿.不知道监制是谁,也不知道导演是谁,更不知道其他演员是谁,老板说交给我了,就糊里糊涂的出演了.跌跌撞撞演出7.8个版本就拿去让需求方选了,最后也是蛮顺利的选了一版.然后再优化再改改,也在那一周每天熬到个11点,最后在约定时间之前,交给负责后期的前端同学,然后,然后就上线了...当时的感受是:原来产品设计就是这样的啊..上线之后,不尽人意,很多东西

升级到Vista/2008 SP2的注意事项

近日Microsoft发布了Windows Server 2008与Vista的SP2补丁.如果你以前安装了SP2的Beta版本,在升级到正式版之前,需要卸载这个补丁.在Windows 2008/Vista中,卸载补丁的"地方"发生了变化,请朋友们注意. (1)从"控制面板"中双击"Windows Update",如图1所示. 图1 选择Windows update (2)单击左下角的"己安装的更新",如图2所示. 图2 己安

升级到 CentOS 5.6 的注意事项

CentOS 5.6 是 CentOS 5 发行系列的第六次更新.它包含了很多错误修正.升级和新功能.在往下读之前我们推荐您先阅读 UOP 的发行注记(或单页发行注记)及技术性注记(或单页技术性注记).本文档的额外部分只作为一个附录并主要涉及关于 CentOS 的问题. 如果你之前已经安装了CentOS 5.5,打算在近期升级到 CentOS 5.6,那么以下内容是你需要关注的: 首先,做好备份(你应该知道应该备份什么),这个不用多说. 然后,执行以下命令: yum clean all yum

Android Studio项目引入外部库注意事项(PullToRefresh)

Android Studio开发App项目时引入第三方库是个比较麻烦的事情.之前导入Volley就折腾了好久,导入下拉刷新控件PullToRefresh时又碰到了各种问题.在此记录一下,以便查阅. 一.导入PullToRefresh 1.将PullToRefresh克隆到本地 git clone https://github.com/chrisbanes/Android-PullToRefresh 2.克隆到本地后library目录复制到app同级目录下,并将名称改为PullToRefresh

爱立信完成意大利3回传网络全面升级项目

爱立信(NASDAQ:ERIC)即将完成对意大利3回传网络的全面升级项目.意大利3是和记黄埔旗下的子公司,也是3G时代的先行者.此项升级项目完成后,意大利3将可向其客户提供最高42Mbps的下行链路速率.该项目于2011年启动,爱立信负责为意大利3升级和演进其网络架构,并帮助其迁移至端到端的全IP回传和接入网架构. 意大利3首席运营官DinaRavera表示:"自从我们于2003年在全球首次推出通用移动通信系统(UMTS)以来,我们就一直积极主动地为消费者构建和维护最为先进的网络.消费者希望接入

项目只有class文件怎么办

问题描述 项目只有class文件怎么办 现接手个很久之前的项目,没有源代码了,只有已经部署的class文件,反编译又不是很准确,现在要修改代码要怎么办? 解决方案 反编译整个项目的class.可以使用jd-gui工具 解决方案二: 没有办法从class精确还原成java文件.因为注释.局部变量名都被编译器忽略了.这些信息没办法再从编译后的程序得到. 好比一张纸烧掉了,虽然灰烬还在,上面的字没办法还原了一样. 解决方案三: java web程序中将外部class文件加入到项目中要注意的事项Ecli

Selenium自动化测试用例设计注意事项(一)

自动化测试设计简介 我们在本章提供的信息,对自动化测试领域的新人和经验丰富的老手都是有用的.本篇中描述最常见的自动化测试类型, 还描述了可以增强您的自动化测试套件可维护性和扩展性的"设计模式".还没有使用这些技术的.有经验的自动化测试工程师会对这些技术更加感兴趣. 测试类型 您应该测试应用程序中的哪些部分?这取决于您的项目的各种影响因素:用户的期望,时间期限,项目经理设置的优先事项等等.但是,一旦项目边界定义完成,作为测试工程师,你必须做出要测试什么的决定. 为了对Web应用的测试类型

在Windows环境下用Yeoman构建AngularJS项目

本文将通过 Yeoman 创建一个 AngularJS 应用,同时 也能感受到 Grunt 和 Bower 的功能. 认识Yeoman Yeoman 是一位戴帽子.立意奇颖的人. Yeoman 是一套工作流程. Yeoman 是Web 应用开发脚手架. 通过很少的命令,就能给你整个应用或者独立的模块生成模板代码,比如控制器或者模型.Yeoman 可以启动预览 Web 服务器,观察文件,如果被编辑,就会重新加载的变化和编译你的 Sass . Yeoman 也可以运行单元测试,最小化代码,优化图像等

看“处女座”学府如何升级新网络

处女座的人,思虑周全,非常细腻,谨慎且擅长分析,凡事要求做到尽善尽美,通常是个完美主义者.但是如果用户"处女座"般的挑剔去面对网络的升级改造和管理,不知道有多少厂商还能"扛得住"?   "纠结"四连发 近期,被誉为"中国刑警的最高学府"."东方福尔摩斯的摇篮"的中国刑警学院(下文简称"警院")上演了一场"完美版"的网络升级.警院不仅采用了锐捷因地制宜的无线部署方案.在