您的位置:首页 > 编程语言

vc7代码迁移到vc8的一些注意事项

2006-06-04 13:14 543 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class vector fun c function