freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

vc6轉到換高版本的問題及解決方法(編輯修改稿)

2025-07-04 13:38 本頁面
 

【文章內容簡介】 39。LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)39。None of the functions with this name in scope match the target type以上兩個編譯錯誤產生是因為新舊版本的MFC 中對ON_MESSAGE消息映射宏定義不同引起的,先看看老版本的MFC的ON_MESSAGE消息宏定義:define ON_MESSAGE(message, memberFxn) \{ message, 0, 0, 0, AfxSig_lwl, \(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))amp。memberFxn },再看看新版本的ON_MESSAGE定義:define ON_MESSAGE(message, memberFxn) \{ message, 0, 0, 0, AfxSig_lwl, \(AFX_PMSG)(AFX_PMSGW) \(static_cast LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) \(memberFxn)) },注意,函數類型沒有變化,都是:LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM)。類型的函數指針(CWnd以及派生類的類成員函數指針),區(qū)別之處是新的ON_MESSAGE宏使用C++的 static_cast 操作符代替了C類型的強制轉換。產生這兩個錯誤其實是因為用戶沒有按照ON_MESSAGE宏的約定聲明和定義消息響應函數造成的,比如,對于某些不需要處理返回值的消息響應函數,用戶通常這樣聲明和定義消息響應函數:在頭文件中聲明:afx_msg void OnFileProcess(WPARAM wParam,LPARAM lParam)。在源文件中實現(xiàn):void CCrpFileOpavDlg::OnFileProcess(WPARAM wParam, LPARAM lParam){.......}或者更過分一些,直接指定為實際參數類型:在頭文件中聲明:afx_msg void OnFileProcess(LPCTSTR lpszMessage, int nPercent)。在源文件中實現(xiàn):void CCrpFileOpavDlg::OnFileProcess(LPCTSTR lpszMessage, int nPercent){.......}舊版本的ON_MESSAGE使用了C類型的強制轉換,宏解開后的代碼后不會產生錯誤信息,但是改成對類型檢查很嚴格的static_cast 操作符時就出問題了,因為通不過static_cast 操作符的檢查。解決方法就是修改代碼,同時吸取教訓,普遍使用的方法并不一定就能約定俗成,一切還是要按照規(guī)矩來。錯誤現(xiàn)象之三:f:\project\.....\(74) : error C2440: 39。static_cast39。 : cannot convert from 39。UINT (__thiscall CWzButton::* )(CPoint)39。 to 39。LRESULT (__thiscall CWnd::* )(CPoint)39。Cast from base to derived requires dynamic_cast or static_cast出現(xiàn)這個錯誤的原因可是“人力不可抗拒”之原因造成的,因為舊版本的 ON_WM_NCHITTEST 宏使用了UINT (__thiscall CWzButton::* )(CPoint)。類型的類成員函數指針,其定義如下:define ON_WM_NCHITTEST() \{ WM_NCHITTEST, 0, 0, 0, AfxSig_wp, \(AFX_PMSG)(AFX_PMSGW)(UINT (AFX_MSG_CALL CWnd::*)(CPoint))amp。OnNcHitTest },但是新版本變成了:define ON_WM_NCHITTEST() \{ WM_NCHITTEST, 0, 0, 0, AfxSig_l_p, \(AFX_PMSG)(AFX_PMSGW) \(static_cast LRESULT (AFX_MSG_CALL CWnd::*)(CPoint) (amp。ThisClass :: OnNcHitTest)) },注意返回值類型由UINT改成了LRESULT,再加上static_cast的嚴格檢查,所以就出錯了。修改的方法就是將你的OnNcHitTest函數由:afx_msg UINT OnNcHitTest(CPoint point)。改成:afx_msg LRESULT OnNcHitTest(CPoint point)。不必太在意,這個不是你的錯,不過,如果你要維護一個老的界面庫(通常很多控件的subclass都會用到ON_WM_NCHITTEST),改起來還是很痛苦地,不扯了,繼續(xù)下一個。七、 和 的廢棄(obsolete)問題在編譯老的ATL向導生成的代碼時,會遇到下面的編譯輸出: is obsolete. Please remove it from your project. is obsolete. Please remove it from your project.:ifdef _ATL_STATIC_REGISTRYinclude include endifinclude 根據提示刪除include 和include 兩行代碼就行了,不過更好的辦法是這樣改:ifdef _ATL_STATIC_REGISTRYinclude if _MSC_VER = 1200 // MFC or earlierinclude endifendifif _MSC_VER = 1200 // MFC or earlierinclude endif八、新的C++編譯器不再支持默認類型的變量定義錯誤現(xiàn)象是:f:\project\.....\(464) : error C4430: missing type specifier int assumed. Note: C++ does not support defaultint產生這個錯誤的原因是程序中出現(xiàn)了這樣的代碼:const some_const_var = 10?;騭tatic some_static_bool = FALSE。新的C++編譯器嚴格按照C++標準,不再支持默認類型的變量定義方式,必須嚴格指定變量類型,如下使用:const int some_const_var = 10?;騭tatic BOOL some_static_bool = FALSE。九、for 語句的變量作用域問題考察下面的代碼:for(int i = 0。 i 120。 i++){if(something_happen){break。}.............}if(i 120){//something happen}在VC6的編譯器中,這樣的代碼是沒有問題的,因為VC6的編譯器為了兼容舊的Microsoft C/C++編譯器,沒有嚴格按照C++標準執(zhí)行,但是從VC7開始,VC的編譯器開始遵守C++標準,所以就會出現(xiàn)“變量i沒有定義的錯誤”。解決的方法也很簡單,按照Jim Hyslop 和 Herb Sutter的經典對話系列的第四篇中的方法,改成如下就可以了:int i。for(i = 0。 i 120。 i++)十、字符串函數的返回值問題strchr(_tcschr)、strpbrk(_tcspbrk ??)、strrchr(_tcsrchr)和strstr(_tcsstr)這四個函數在VC6的CRT庫中定義的返回值都是char *(TCHAR *),所以以前的代碼通常是這樣使用的:TCHAR *cp = _tcschr( pszPath, _T(39。\\39。) )。//使用*cp,可以通過cp指針修改pszPath的內容這其實是一個“漏洞”,因為如果pszPath是const char(TCHAR) *字符串,那么就表示它不希望修改字符串的內容,但是調用strchr(_tcschr)函數后就可以通過cp指針
點擊復制文檔內容
教學教案相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1