1. 变量作用域 在vc7.1中, 如果一个变量定义在for语句的条件从句中,那么这个变量可以在for之后使用。但Vc8禁止这样,会报告一个C2065错误.
for (
int i = 0 ; i < 10 ; ++ i)
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
// 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 作为默认返回值类
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
Func()
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
return 0 ;} ;
// error in VC8 解决方法:
明确声明函数返回值类型为 int.
int Func()
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
return 0 ;} ;
5. 函数地址
Vc7中函数名就是地址。在vc8中,必须要使用&操作符同时写出这个方法的全名(fully qualified name).
class A
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
public :
int Test(
void );
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
} ;
void fun(
int (A:: * test) (
void ));
int main()
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
![InBlock.gif](http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif)
fun(A::Test);
// C3867 error in VC
return 0 ;
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
}
解决方法:
加上 &.
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
fun( & A::Test);
6. 隐式类型转换VC8不允许B* 到const B*&的隐式转换.
class B {} ;
void fun (
const B * & );
// if possible use const B* instead
int main()
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
![InBlock.gif](http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif)
B * test =
new B();
![InBlock.gif](http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif)
fun (test);
// error in VC8
return 0 ;
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
}
解决方法:
强制转换或函数参数变成const B*。
void fun (
const B * );
7. 友元方法(Friend function)
VC8不允许声明一个private或protected函数为友元.
class A
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
private :
void c();
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
} ;
class B
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
![InBlock.gif](http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif)
friend
void A::c();
// C2248 error, c() is invisible to class B.
} ;
解决方法 1:
声明友元类.
class A
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
private :
void c();
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
} ;
class B
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
![InBlock.gif](http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif)
friend
class A;
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
} ;
解决方法 2:
把函数声明为public
class A
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
public :
void c();
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
} ;
class B
![ExpandedBlockStart.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif)
{
![InBlock.gif](http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif)
friend
void A::c();
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
} ;
8. STL的stdext 命名空间
在vc8中,hash_map 和hash_set 被移进了stdext命名空间中.
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
#include < hash_map >
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
std::hash_map
// error in VC8 解决方法:
使用stdext 命名空间.
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
#include < hash_map >
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
stdext::hash_map
9. 头文件
许多头文件如fstream.h 和iostream.h在VC8中已经不存在了.
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
#include < fstream.h >
// error in VC8 解决方法:
使用STL.
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
#include < fstream >
10. Iterator
一些 STL 类, iterators 不再用指针实现
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
std::vector < DMDetailRow > m_data;
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
std::vector < DMDetailRow > ::iterator iter = & m_data[rowNum];
解决方法:
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
std::vector < DMDetailRow > ::iterator Iter = m_data.begin() + rowNum;
11. Enum
使用一个Enum的成员时,不要使用enum的名字
enum E
{
![InBlock.gif](http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif)
a,b,c
![ExpandedBlockEnd.gif](http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
} ;
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
E e1 = E::a;
// warning in VC8 解决方法:
去掉Enum 的名字.
![None.gif](http://www.cnblogs.com/images/OutliningIndicators/None.gif)
E e1 = a;