程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VC++6.0版本程序轉成VS2010版

VC++6.0版本程序轉成VS2010版

編輯:C++入門知識

直接轉換的時候遇到兩個問題:

1、預編譯頭文件*.PCH找不到

2、static_cast”: 無法從“void (__thiscall CView2::* )(void)”轉換為“LRESULT (__thiscall CWnd::*

1、來源:http://www.zhuyanfeng.com/archives/2231

錯誤:

fatal error C1083: 無法打開預編譯頭文件:“Debug\xxx.pch”: No such file or directory

“Rebuild All”沒有解決,然後把“C/C++”屬性中的“預編譯頭”由“使用(/Yu)”改為“創建(/Yc)”,問題解決了。看來還是預編譯頭文件xxx.pch創建的有問題,仔細想一下,vc工程的預編譯頭是由stdafx.cpp編譯生成的。(其實起作用的是stdafx.h,但頭文件不參加編譯,所以需要stdafx.cpp文件,這個文件裡只有一句代碼:#include “Stdafx.h”。)

\

綜上:最妥善的解決方法就是,在工程屬性中,選擇“使用(/Yu)”預編譯頭,而單獨將stdafx.cpp設置為“創建(/Yc)”預編譯頭。

關於“預編譯頭”的作用,參考如下:

在很多程序中,每個源文件都存在一些相同的部分。比如要包含相同的一些頭文件,而且這些頭文件可能很長,例如window.h。如果用普通的方法編譯這些源文件,對這些頭文件在每個源文件中的出現都要重新編譯,作了很多重復工作。如果能將這些頭文件專門進行編譯,並且把結果存儲起來。然後在編譯包含這些頭文件的源文件時,使用上述結果替代頭文件在源文件中的出現,就可以大大減少工作量。Microsoft Visual C++提供的“預編譯頭文件”機制就支持這一功能。

所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件裡(通常以.pch為擴展名),這個文件就稱為預編譯頭文件。這些預先編譯好的代碼可以是任何的C/C++代碼——–甚至是inline的函數,但必須是穩定的,在工程開發的過程中不會被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。注意生成預編譯頭文件是很耗時間的。同時得注意預編譯頭文件通常很大,通常有6-7M大。注意及時清理那些沒有用的預編譯頭文件。

也許你會問:現在的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它只會編譯那些經過修改的文件,而不會去編譯那些從上次編譯過,到現在沒有被修改過的文件。那麼為什麼還要預編譯頭文件呢?答案在這裡,我們知道編譯器是以文件為單位編譯的,一個文件經過修改後,會重新編譯整個文件,當然在這個文件裡包含的所有頭文件中的東西(.eg Macro, Preprocesser )都要重新處理一遍。VC的預編譯頭文件保存的正是這部分信息。以避免每次都要重新處理這些頭文件。



2、來源http://blog.csdn.net/chenyujing1234/article/details/7387712

不能轉換void (_thiscall CMainFrame::*)(void)to LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)2010-05-13 11:35開發平台由VC6.0升級至VS2005,需要將原有的項目遷移,可能碰到類似錯誤:
error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMainFrame::* )(void)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'

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

ON_MESSAGE(WM_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)”
在匹配目標類型的范圍內沒有具有該名稱的函數

解決方法如下:

首先,把原來的消息函數返回值類型改為LRESULT,函數內可以隨便寫個return TRUE; 然後消息函數的參數必須改寫成(WPARAM wParam,LPARAM lParam)而不論這兩個參數是否用得到;最後,消息映射如ON_MESSAGE(WM_message,& OnMyMessage)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved