从总体上说VC8比VC7.1语法上严格且严谨。文中只涉及到编译问题,链接的问题没有包含在内。
1. 变量作用域
在vc7.1中, 如果一个变量定义在for语句的条件从句中,那么这个变量可以在for之后使用。但Vc8禁止这样,会报告一个C2065错误.
VC7转换到VC8的常见问题for (int i = 0; i < 10++i)  
error in Vc8

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

VC7转换到VC8的常见问题int i =0;                    
VC7转换到VC8的常见问题
for (i = 0; i < 10++i)
VC7转换到VC8的常见问题
for (i = 0; i < 5++i)

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

VC7转换到VC8的常见问题const & int a; //error in VC8
VC7转换到VC8的常见问题
const * int b;  //error in VC8
VC7转换到VC8的常见问题
int myfun (const & B); //error in VC8

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

VC7转换到VC8的常见问题const int& a; 
VC7转换到VC8的常见问题
const int* b;
VC7转换到VC8的常见问题
int myfun (const B&);

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

VC7转换到VC8的常见问题static i = 0// C4430 error in Vc8 
VC7转换到VC8的常见问题
const i = 0//C4430 error

解决方法:
加上int.

VC7转换到VC8的常见问题static int i = 0
VC7转换到VC8的常见问题
const int i = 0;

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

VC7转换到VC8的常见问题Func()
error in VC8

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

VC7转换到VC8的常见问题int Func()
;

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

VC7转换到VC8的常见问题class A
}

解决方法:
加上 &.

VC7转换到VC8的常见问题fun(&A::Test);

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

}

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

VC7转换到VC8的常见问题void fun ( const B*  );

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

VC7转换到VC8的常见问题class A
;

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

VC7转换到VC8的常见问题class A
;

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

VC7转换到VC8的常见问题class A
;

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

VC7转换到VC8的常见问题#include <hash_map>
VC7转换到VC8的常见问题std::hash_map 
//error in VC8

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

VC7转换到VC8的常见问题#include <hash_map>
VC7转换到VC8的常见问题stdext::hash_map

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

VC7转换到VC8的常见问题#include <fstream.h> //error in VC8

解决方法:
使用STL.

VC7转换到VC8的常见问题#include <fstream>

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

VC7转换到VC8的常见问题std::vector<DMDetailRow> m_data;
VC7转换到VC8的常见问题std::vector
<DMDetailRow>::iterator iter = &m_data[rowNum];

解决方法:

VC7转换到VC8的常见问题std::vector<DMDetailRow>::iterator Iter = m_data.begin() + rowNum;

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

VC7转换到VC8的常见问题enum E
warning in VC8

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

VC7转换到VC8的常见问题E e1 = a;

相关文章:

  • 2021-12-30
  • 2021-05-31
  • 2021-05-03
  • 2022-02-05
  • 2021-07-14
  • 2021-07-21
  • 2021-05-24
猜你喜欢
  • 2021-07-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-24
  • 2021-07-30
  • 2022-12-23
  • 2022-01-18
相关资源
相似解决方案