Posted on 2006-03-13 11:03
小明 閱讀(21925)
評論(12) 編輯 收藏 引用 所屬分類:
C/C++
作為C++編譯器,從vc6到vc8最大的調整就是對C++標準的支持更好了。
我發現的幾點不同。
a. For 循環的聲明
Vc6: for(int i<0;i<100;++i){}; j = i; (ok)
Vc8: for(int i<0;i<100;++i){}; j = i; (illegal)
int i; for(i<0;i<100;++i){}; j = i; (ok)
Vc8中的for循環中變量的有效期僅僅在for 循環的開始與結束期間有效。
b.string實現
Vc6: string s; char *p = s.begin(); (ok)
Vc8: string s; char *p = s.begin(); (illegal)
string s; char *p = const_cast<char *>(s.c_str()); (ok)
在vc6中,string::iterator被定義為char *,但是vc8中不是
c.更嚴格的typename聲明的需要
Vc6:
template<class T>
class Test
{
public:
typedef map<T,T> mymap;
mymap::iterator mymap_iter;
}; (ok)
Vc8:
template<class T>
class Test
{
public:
typedef map<T,T> mymap;
mymap::iterator mymap_iter;
}; (illegal)
typename mymap::iterator mymap_iter;(ok)
vc8更加嚴格的要求程序員在類型前面加上typename以避免歧義
d.不允許默認的int類型
Vc6: fun() { return 0;} (ok)
Vc8: fun() { return 0;} (illegal)
int fun() { return 0;} (ok)
vc8不支持默認返回int類型
e.typedef必須是public才能被外界訪問到
Vc6:
Class Test
{
typedef int iterator;
};
Test::iterator i; (ok)
Vc8:
Class Test
{
typedef int iterator;
};
Test::iterator i; (illegal)
Class Test
{
public:
typedef int iterator;
};
Test::iterator i; (ok)
附錄:一些資源(From msdn)
Overviews:
Moving from 6.0 to 7.1:
Moving from 7.1 to 8.0: