在vc7.1中, 如果一個變量定義在for語句的條件從句中,那麼這個變量可以在for之後使用。但Vc8禁止這樣,會報告一個C2065錯誤.
{
//codes here
}
if (i < 10).. //error in Vc8
for (i = 0; i < 5; ++i) //error in Vc8
解決方法:
在for語句之前聲明變量(可保證代碼在vc7.1和vc8下同時編譯通過)
for (i = 0; i < 10; ++i)
for (i = 0; i < 5; ++i)
2. 指針和引用的聲明
在Vc7.1中, 下面的代碼可以編譯, 但是vc8會報C4430 錯誤。(很難想象有些美國程序員竟然這樣聲明)
const * int b; //error in VC8
int myfun (const & B); //error in VC8
解決方法:
把* 或&放到類型的後面.
const int* b;
int myfun (const B&);
3. 默認int類型
在vc7.1中,如果定義一個變量但不聲明類型,那麼默認爲int。VC8不支持。
const i = 0; //C4430 error
解決方法:
加上int.
const int i = 0;
4. 函數的默認返回值類型
同上,VC8不支持把 int 作爲默認返回值類
{return 0;}; //error in VC8
解決方法:
明確聲明函數返回值類型爲 int.
{return 0;};
5. 函數地址
Vc7中函數名就是地址。在vc8中,必須要使用&操作符同時寫出這個方法的全名(fully qualified name).
{
public:
int Test(void);
};
void fun(int (A::*test) (void));
int main()
{
fun(A::Test);//C3867 error in VC
return 0;
}
解決方法:
加上 &.
6. 隱式類型轉換
VC8不允許B* 到const 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*。
7. 友元方法(Friend function)
VC8不允許聲明一個private或protected函數爲友元.
{
private:
void c();
};
class B
{
friend void A::c(); //C2248 error, c() is invisible to class B.
};
解決方法 1:
聲明友元類.
{
private:
void c();
};
class B
{
friend class A;
};
解決方法 2:
把函數聲明爲public
{
public:
void c();
};
class B
{
friend void A::c();
};
8. STL的stdext 命名空間
在vc8中,hash_map 和hash_set 被移進了stdext命名空間中.
std::hash_map //error in VC8
解決方法:
使用stdext 命名空間.
stdext::hash_map
9. 頭文件
許多頭文件如fstream.h 和iostream.h在VC8中已經不存在了.
解決方法:
使用STL.
10. Iterator
一些 STL 類, iterators 不再用指針實現
std::vector<DMDetailRow>::iterator iter = &m_data[rowNum];
解決方法:
11. Enum
使用一個Enum的成員時,不要使用enum的名字
{
a,b,c
};
E e1 = E::a; //warning in VC8
解決方法:
去掉Enum 的名字.