天天看點

幾個VC6.0到VC9.0的錯誤解決方案

幾個VC6.0到VC9.0的錯誤解決方案

技術研究    2008-04-12 13:21   閱讀794   評論2   字号: 大 大  中 中  小 小

        說起現在這個引擎吧,總是沒有太多時間去寫,不過在半個月前就已經完成了,而且在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)

 { return SetGroupVolume(fVolume, m_lstEffect); }    //C2240

         在Standard C++下,是不會自動去轉換的,其實這不是我們代碼的問題,是VC7.0開始的一個檢查更改,我們要做的就是迎合VC9.0就行,不必大幅改動我們的代碼部分,方案如下:

 // 設定音效音量

void  SetEffectVolume(float fVolume)

 { return SetGroupVolume(fVolume, m_lstEffect); }  //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: '<function-style-cast>' : 無法由 'void' 轉換為 'GEng::NotifyFun'

我不廢話了,還是一個RETURN的檢查引起的問題.改吧....

可能性1:宏定義在導入VC9.0時順序換了位.在MAIN.CPP前面加上宏定義頭檔案"GENG_GUIOBJ.H",錯誤依舊

可能性2:宏定義裡位址傳遞上,方法不能在VC9.0裡展現.

typedef void (GEngControl::*NotifyFun)(void);  //定義部分代碼

struct NotifyEvent

{

 NotifyEvent() : function(NULL), invoker(NULL) {}

 NotifyFun function;

 GEngControl *invoker;

}; //沒有類型轉換過程.....檢視控件定義裡....

//控件定義部分代碼:

#define ON_CLICK(obj, fun) /

{ /

 (obj)->OnClick.function = NotifyFun(fun); /   //C2440

 (obj)->OnClick.invoker = this; /

}

在這裡,隻有一種方法可行,也必須這麼改,如果沒有經驗的話,一般不知道如何下手.方案如下:

 (obj*)->OnClick.function = NotifyFun(fun); /   //C2440

 (obj*)->OnClick.invoker = this; /

到此為止,終于成功地從VC6.0轉到了VC9.0上.

總結:其實VC的高版本改變往往是為了更安全,為了我們的程式在編譯成功後運作更建全考慮的,不要怕麻煩,不要一出錯就換低版本的,呵呵....

          牙疼兩天了,今天還沒吃飯呢,好餓,但牙不争氣,看見飯就煩.先寫這麼多吧.有什麼問題,留言就行了.大家一起研究,我的GEng2D遊戲引擎總算在VC9.0上安了家,還出了DEBUG版.明天看有時間把DEMO也在VC9.0編譯一下不,然後發出來,讓大家指教指教......