OpenGL + Win32 SDK 開發框架的搭建(C++語言版)(先補上一個問題!!)

(具體內容有時間補上去。)

/***************************************************************************************************************************

這裏先記錄開發中碰到的一個問題。


背景介紹:

OpenGL + Win32 SDK編程,使用C++語言。

使用VS2008,使用Debug生成或者Release生成。

一個父類GLWindow,該類有虛方法Method1(), Method2(), ... MethodN()。

兩個子類Win1, Win2都單繼承自GLWindow,分別重載了Method1(), Method2(), ... MethodN()。


在主程序中,動態生成兩個子類各一個實例。

GLWindow * pWnd1 = new Win1();

GLWindow * pWnd2 = new Win2();

我想看到多態特性。


現象:

在使用Debug生成時一切正常,使用Release生成時有問題,如下:

調用pWnd1.Method1(), pWnd2.Method1(),運行正確,能夠進入各自的方法。

調用pWnd1.Method2(), pWnd2.Method2(),運行正確,能夠進入各自的方法。

調用pWnd1.Method3(), pWnd2.Method3(),結果pWnd1.Method3()總是進不去,直接進入pWnd2.Method3()方法 【使用單步跟蹤~~】

...  (其他的方法有的正常,有的也出現上述問題)


分析:

觀察後發現,Method3方法在Win1和Win2子類中實現時的代碼是一模一樣的,所以其中一個的代碼被優化掉了!(其實,在機器看來,執行效果是一樣的,可是程序員看到就要納悶了)

如果改動了其中任何一個的實現,則運行過程是對的。如果不改動代碼,使用Debug模式結果總是正確的。

我嘗試修改Debug和Release兩種配置,更改了很多選項都不能解決問題。


總結:

1. 使用Release和Debug模式是有很多區別的,編譯器和連接器提供的選項需要不斷的去熟悉。

2. 雖然上面的現象不影響程序運行結果,但是總歸有點不祥之兆。也許是我大驚小怪了,只是IDE不夠智能?亦或是編譯連接程序已經給優化掉了?至此我尚不知原因。

3. 但我還是發現了Release模式時可能會影響程序運行結果的一種情況。使用"assert(DoSomething());"這句代碼,將會導致DoSomething()不被執行。需要使用替代語法"BOOL ret = DoSomething(); assert(ret);"。這個問題也曾經困擾了我多時。

***************************************************************************************************************************/


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