今天照孫鑫的書寫了個自定義訊息函式,結果出錯(vs2008平台下),找了一下,發現問題所在,vs2008比vc6.0型別檢查更加嚴格!
1訊息對映
vs2005對訊息的檢查更為嚴格,以前在vc6下完全正常執行的訊息對映在vs2005下編譯不通過
a. on_message(message,onmymessage);
error c2440: 「static_cast」: 無法從「void (__thiscall cpppview::* )(wparam,lparam)」轉換為「lresult (__thiscall cwnd::* )(wparam,lparam)」
在匹配目標型別的範圍內沒有具有該名稱的函式
error c2440: 「static_cast」: 無法從「void (__thiscall cpppview::* )(void)」轉換為「lresult (__thiscall cwnd::* )(wparam,lparam)」
在匹配目標型別的範圍內沒有具有該名稱的函式
b. on_command_ex(id,onmymessage2);
在vs2005中,onmymessage返回值必須為bool,且含有乙個 uint 引數指出了命令id,其形式為:afx_msg bool onmymessage(uint);如果不符合,
error c2440: 「static_cast」: 無法從「bool (__thiscall cmainframe::* )(void)」轉換為「bool (__thiscall ccmdtarget::* )(uint)」
在匹配目標型別的範圍內沒有具有該名稱的函式
error c2440: 「static_cast」: 無法從「bool (__thiscall cmainframe::* )(void)」轉換為「bool (__thiscall ccmdtarget::* )(uint)」
在匹配目標型別的範圍內沒有具有該名稱的函式
2 字元處理
在c中廣泛使用的strcpy,strcat,strstr等等推薦使用更為安全的strcpy_s,strcat_s,strstr_s等來代替
3 數學函式檢查
vs2005中,數學函式的引數檢查更為嚴格,如pow(2, 45)會引起乙個錯誤提示如下:
error c2668: 「pow」: 對過載函式的呼叫不明確
d:\program files\microsoft visual studio 8\vc\include\math.h(575): 可能是「long double pow(long double,int)」
d:\program files\microsoft visual studio 8\vc\include\math.h(527): 或「float pow(float,int)」
d:\program files\microsoft visual studio 8\vc\include\math.h(489): 或「double pow(double,int)」
試圖匹配引數列表「(int, int)」時
正確的使用為pow(2.0, 45)
3 更加符合c++標準
如在vs6中,在for迴圈中的迴圈變數的定義的作用域延伸到迴圈體外,vs2005則修正了這樣的bug。
vc6:
for(int i=0;i<100;i++)f2();
for(i = 1;i<10;i++)f1();
//i已經定義
而有vs2005中,第二句的i必須重新定義。
vc6 0轉vs2008連線錯誤
把vc6.0的工程轉到vs2008後,編譯發現有連線錯誤。如下 1 cvtres fatal error cvt1100 duplicate resource.type manifest,name 1,language 0x0409 1 link fatal error lnk1123 failur...
VS2008與VC6 0的變化
1.messagebox vc 6.0 messagebox hello,world vs2008 messagebox l hello,world 或 messagebox text hello,world 2.combo box內容新增方法 vc 6.0 drop down list box c...
VS2008與VC6 0的變化
1.messagebox vc 6.0 messagebox hello,world vs2008 messagebox l hello,world 或 messagebox text hello,world 2.combo box內容新增方法 vc 6.0 drop down list box c...