今天在VS2008中發現了超級令人抓狂的問題,經實驗發現在VS2010中有同樣的問題存在。
重現問題——
在VS2008中建立C++的“win32控制台應用程式”項目,並添加對MFC類庫的引用。
在_tmain函數前加上的注釋,然後在主函數中隨便寫上幾句代碼,並設定斷點,整個代碼。
最後在debug模式下,按F5運行,結果,程度在第二個斷點處沒有停住,而是直接運行過去!!
經過反覆的實驗——包括刪除ncb檔案,重啟VS,重啟電腦……忽然想到《Exceptional C++ Style》中有提到注釋可能對代碼產生影響,比如 “//?” 會被轉換成 “\”,結果使第二行代碼失效了!!
難道這裡也是因為注釋的問題?於是將_tmain()前的注釋去掉後,果然,斷點的功能居然又回來了!!
注釋掉的代碼也會對程式的調試產生影響!!為了弄明白這個問題,本人接下來查看了其產生的彙編代碼——即程式運行到第一個斷點處時,調出反組譯碼視窗,
明明是好好的一段注釋代碼,但微軟的VS編譯器,硬是在其中加了一堆代碼。本人現在才開始學win32下的彙編,只知道ebp,esp是用在函數調用時傳遞參數用的。
在已經被注釋掉的代碼卻產生了目標代碼,雖然沒有對程式的結果造成直接影響(該執行的地方都正常運行了,上面的程式可以正常輸出1),但不能在調試時查看斷點,最令人揪心的是不知這些多餘的代碼何時會產生更大的影響。並且發現對已經注釋掉的結構體裡的內容進行修改後(比如添加或減少幾個欄位的申明),也會影響代碼的產生……
當本人花了幾個小時找出這個問題後,心情依然沉重,結果是現在不敢在VC++中使用 // 風格的注釋了(上面的注釋掉成/* */後就沒問題),並且嘗試了其它可能出現問題的情況。
最後,自己重建立立項目,並且所有的代碼都自己敲上去,發現一切OK。原來~~原來,上面那段注釋過的代碼是同事用QQ發給我的!!!!而QQ對話方塊中的換行和VS中的轉行編碼不一樣,於是就出現了上面這種注釋掉的代碼會對程式產生影響的情況~~ QQ~~