幾個vc6.0到vc9.0的錯誤解決方案
技術研究
2008-04-12 13:21
字型大小: 大
大
中中
小小
說起現在這個引擎吧,總是沒有太多時間去寫,不過在半個月前就已經完成了,而且在vc6.0上是完全通過的,兩個demo的執行也完全正常,昨天學人家追追新流,一改往日的固執,裝了個vc9.0,結果出了幾十個warning,還有15個error,這些都是因為vc6.0到vc9.0的轉換上,還有處理規則有所變動產生了.如下是我的解決方案,希望對大家有所幫助,因為這個引擎目前還不到發布時間,所以不會有大量的原始碼帖出,敬請原諒:
1.c4430和c4996警告,因為我們是在/w3下debug,所以會出現好多這種warning,根據我的經驗,如果我們對自己的**和demo非常有信心的情況下,這些警告是多餘的,我們真正要去解決的是errors,所以我們先把warning全都去了,要不然看著讓人煩.....
方法非常簡單: 在命令列加入/wd4430 /wd4996,.....是不是非常簡單,
好了,現在把這幾十個warning的編譯資訊去掉後,看著就不煩了,心情好多了.留給我們接下來真正要解決的東西出如下:
2.error c2440: 'return' : 無法由 'void' 轉換為 'int' :
產生這種錯誤的原因吧,我開始也進入了誤區,我直接回頭去檢查**裡的return,浪費了不少時間,其實這個錯誤是因為,在standard c++程式庫中所執行的一致性和更新工作產生的.原始碼如下:
// 設定音效音量
inline seteffectvolume(float fvolume)
//c2240
在standard c++下,是不會自動去轉換的,其實這不是我們**的問題,是vc7.0開始的乙個檢查更改,我們要做的就是迎合vc9.0就行,不必大幅改動我們的**部分,方案如下:
// 設定音效音量
void seteffectvolume(float fvolume)
//it's ok.....
3. error c3867: 'myform::buttonctrlclick': 函式呼叫遺漏引數清單,請用 '&myform::buttonctrlclick' 建立成員的指標
其實這也是vs2005之後的乙個更變引起的.對vc++2005的編譯器完成一致性處理後也可能會產生這種錯誤:增強型成員指標一致性.
//**如下:
// panel2 setting
panel2.create(this, 545, 0, pan2bg);
buttongame.create(&panel2, 49, 128, btnbig, "遊戲性(g)");
buttongame.setdownoffset(-1, 3);
on_click(&buttongame, buttonctrlclick); //c3867
buttonvideo.create(&panel2, 49, 187, btnbig, "影象(v)");
buttonvideo.setdownoffset(-1, 3);
on_click(&buttonvideo, buttonctrlclick);//c3867
buttonsound.create(&panel2, 49, 246, btnbig, "聲音(s)");
buttonsound.setdownoffset(-1, 3);
on_click(&buttonsound, buttonctrlclick);//c3867
vs2005以後,在建立指標時,必須用&來建立和傳遞,哎,還真麻煩,不過這種較以往的會更安全.所以不要報怨,這種考慮是必要的.呵呵,微軟還挺周道的.不錯,小小表揚一下.如果用微軟給的方法來解決,很麻煩,我這人向來比較懶,所以我用的方法是,on_click(&buttonvideo, buttonctrlclick());//it's ok...
4.error c2440: '' : 無法由 'void' 轉換為 'geng::notifyfun'
我不廢話了,還是乙個return的檢查引起的問題.改吧....
可能性1:巨集定義在匯入vc9.0時順序換了位.在main.cpp前面加上巨集定義標頭檔案"geng_guiobj.h",錯誤依舊
可能性2:巨集定義裡位址傳遞上,方法不能在vc9.0裡體現.
typedef void (gengcontrol::*notifyfun)(void); //定義部分**
struct notifyevent
notifyfun function;
gengcontrol *invoker;
}; //沒有型別轉換過程.....檢視控制項定義裡....
//控制項定義部分**:
#define on_click(obj, fun) /
在這裡,只有一種方法可行,也必須這麼改,如果沒有經驗的話,一般不知道如何下手.方案如下:
(obj*)->onclick.function = notifyfun(fun); / //c2440
(obj*)->onclick.invoker = this; /
到此為止,終於成功地從vc6.0轉到了vc9.0上.
總結:其實vc的高版本改變往往是為了更安全,為了我們的程式在編譯成功後執行更建全考慮的,不要怕麻煩,不要一出錯就換低版本的,呵呵....
VC 6 0程式開啟檔案記憶體錯誤解決方法
症狀 使用vc6.0,新增檔案或開啟檔案,都出現0x5003eaed記憶體報錯,如下圖 這個問題存在很久了,只是影響不大沒理會,今天有時間上網搜了一下,終於找到解決辦法 微軟提供的解決方案 將該dll檔案拷貝到 x program files microsoft visual studio comm...
win socket程式設計下連線錯誤 VC6 0
在vc6.0下寫了乙個簡單的基於tcp的socket程式,但是在連線時出現如下錯誤 configuration tcpsrv win32 debug linking.main.obj error lnk2001 unresolved external symbol imp closesocket 4...
VC6 0迴圈的彙編
今天突然來了興趣,想看看彙編級的迴圈.include using namespace std int main 1 include 2 using namespace std 3 4 int main 5 00401290 jmp main 28h 00401278 11 12 00401292 p...