VS2003=>VS2005在VC上的一些变化

最近, 找到一个界面库. 想把它转化为VS2005下编译, 岂知出现了NNNNNNNNN个错误!!!这才恍然大悟: VS2003到VS2005在VC上还是改动了不少!!!下面是对这些变化的总结: 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; 此外, 还发现了不少函数声明方面的变化:①ON_WM_NCHITTEST()出现下列错误: 错误 33 error C2440: “static_cast”: 无法从“UINT (__thiscall CGuiControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)” ../guilib1.5/guilib/guicontrolbar.cpp 101 *需要使用LRESULT才行!
②错误 22 error C3861: “tstrlen”: 找不到标识符 ../guilib1.5/guilib/guitabwnd.cpp 458 *在新的MSDN查不到strlen,使用 _tcslen ③错误 31 error C2664: “strcpy”: 不能将参数 1 从“WCHAR [32]”转换为“char *” ../guilib1.5/guilib/guidocktoolbarex.h 26 改为_tcscpy,* 看来在VS2005中处理字符串时不能再像以前那样直接用C风格的了,还是用T形式的吧,既然strcpy要用_tcscpy,其它的字符串函数估计也只好用_tcsxxx了
此外, 还发现了不少函数声明方面的变化:①ON_WM_NCHITTEST()出现下列错误: 错误 33 error C2440: “static_cast”: 无法从“UINT (__thiscall CGuiControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)” ../guilib1.5/guilib/guicontrolbar.cpp 101
*需要使用LRESULT才行! 这个怎么处理啊?怎么使用LRESULT? ------------------------------------------------------------ ------------------------------就拿这个CGuiControlBar来说,它继承自CWnd,而在VC6.0和VC7.1中,CWnd::OnNCHitTest函数的返回值为UINT(在VC8.0中它的返回值改成了LRESULT),当CGuiControlBar重写(Override)这个OnNCHitTest函数的时候,它的返回值也声明为UINT(因为写代码的时候还是针对VC6.0或VC7.1),当在VC8.0中扩展ON_WM_NCHITTEST()宏时,就会出现上面的错误,所以你需要做的只是把CGuiControlBar::OnNCHitTest的返回值声明为LRESULT即可,它只不过是个LONG_PTR(长指针)。
此外, 还发现了不少函数声明方面的变化:①ON_WM_NCHITTEST()出现下列错误: 错误 33 error C2440: “static_cast”: 无法从“UINT (__thiscall CGuiControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)” ../guilib1.5/guilib/guicontrolbar.cpp 101
*需要使用LRESULT才行! 这个怎么处理啊?怎么使用LRESULT? ------------------------------------------------------------ ------------------------------就拿这个CGuiControlBar来说,它继承自CWnd,而在VC6.0和VC7.1中,CWnd::OnNCHitTest函数的返回值为UINT(在VC8.0中它的返回值改成了LRESULT),当CGuiControlBar重写(Override)这个OnNCHitTest函数的时候,它的返回值也声明为UINT(因为写代码的时候还是针对VC6.0或VC7.1),当在VC8.0中扩展ON_WM_NCHITTEST()宏时,就会出现上面的错误,所以你需要做的只是把CGuiControlBar::OnNCHitTest的返回值声明为LRESULT即可,它只不过是个LONG_PTR(长指针)。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值