VC6.0移植到VS2008後的錯誤總結

最近由於要在SISCO的MMS庫基礎上開發,需將開發平臺由VC6.0升級至VS2008,所以需要將原有的項目遷移,免不了碰到移植上的一些問題,特將它們歸納如下:

1  消息映射
VS2008對消息的檢查更爲嚴格,以前在VC6下完全正常運行的消息映射在VS2008下編譯不通過

a. ON_MESSAGE(message,OnMyMessage);
   OnMyMessage返回值必須爲LRESULT,其形式爲:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);如果不符合,則有錯誤提示:
 
     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);
   在VS2008中,OnMyMessage返回值必須爲BOOL,且含有一個 UINT 參數指出了命令ID,其形式爲:afx_msg BOOL OnMyMessage(UINT);如果不符合,
   則有錯誤提示,如在VC6中,OnMyMessage2的定義爲afx_msg BOOL OnViewZoomBar()時亦可正常編譯通過,但在VS2008下,有錯誤提示:
 
   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  編譯找不到並無法升級vc90.pdb的情況
   把一個VC6的工程轉換爲VS2008的工程後,編譯總是出現找不到而且不能升級vc90.pdb文件的問題。重新編譯了也不行。
這個vs2008一個著名的bug。詳情可以參見
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=309462

官方現有解決方案如下:
       I have found an alternate way for the time beging to avoid C2471 error but it works only in the case of successful release build.
for this click Build menu than Configuration manager than create a new setting from release settings. Change following things in your project settings as :

C/C++ | General | Debug Information format | C7 Compatible (/Z7)

C/C++ | Code Generation | Enable String Pooling | Yes (/GF)

Linker |Debuging |General Debug Info | Yes (/DEBUG)
   也就是將項目/**屬性下
   C/C++|常規|調試信息格式 處選擇"C7兼容(/Z7)"
   C/C++|代碼生成|啓用字符串池 處選擇"是(/GF)"
   鏈接器|調試|生成調試信息 處選擇"是(/DEBUG)"即可
這麼設置了之後,每次生成項目,它都會重新編譯,耐心等待唄O(∩_∩)O~
       
3 字符處理
 在c中廣泛使用的strcpy,strcat,strstr等等推薦使用更爲安全的strcpy_s,strcat_s,strstr_s等來代替

4 數學函數檢查
 VS2008中,數學函數的參數檢查更爲嚴格,fabs、pow等函數都嚴格限制參數類型,如fabs(a)會引起一個錯誤提示如下:
 
    error C2668: “fabs”: 對重載函數的調用不明確
  D:/Program Files/Microsoft Visual Studio 9.0/VC/include/math.h(557): 可能是“long double fabs(long double)”
  D:/Program Files/Microsoft Visual Studio 9.0/VC/include/math.h(509): 或“float fabs(float)”
  D:/Program Files/Microsoft Visual Studio 9.0/VC/include/math.h(119): 或“double fabs(double)”
  試圖匹配參數列表“(long)”時
   正確的使用爲fabs((double)a)
  
5 更加符合C++標準
    如在VC6中,在FOR循環中的循環變量的定義的作用域延伸到循環體外,VS2008則修正了這樣的bug。
    VC6:
    for(int i=0;i<100;i++)f2(); 
    for(i = 1;i<10;i++)f1();    //i已經定義
    而有VS2005中,第二句的i必須重新定義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章