再談從vc6遷移到vs2005

作爲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)

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章