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_map9. 头文件 许多头文件如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才行!

本文总结了从Visual Studio 2003迁移到VS 2005过程中遇到的各种编译错误及解决方法,包括变量作用域、指针和引用声明、默认类型、函数返回值等变化。
1578

被折叠的 条评论
为什么被折叠?



