新聞中心
各種分析和設(shè)計Visual C++環(huán)境最突出的就是極限編程了,很多方法都受它影響,它最重要的兩條是先寫測試和結(jié)對編程。先寫測試能強迫程序員給出完整清晰的類接口,還能在每次建立系統(tǒng)時自動測試。

1.Visual C++環(huán)境
適用預(yù)處理#define定義一個或多個調(diào)試標記,在代碼中把調(diào)試部分使用#ifdef 和#endif 進行管理。當程序最終調(diào)試完成后,只需要使用#undef標記,調(diào)試代碼就會消失。常用的調(diào)試標記為DEBUG, 語句序列:
2.運行期間調(diào)試標記
在程序運行期間打開和關(guān)閉調(diào)試標記。通過設(shè)置一個調(diào)試bool標記可以實現(xiàn)。這對命令行運行的程序更為方便。
例如下面代碼:
- #include
- #include
- using namespace std;
- bool debug =false;
- int main(int argc,char*argv[])
- {
- for(int i=0;i
;i++) - if(string(argv[i])==“--debug=on“)
- debug = true;
- bool go=true;
- while(go)
- {
- if(debug)
- {
- 調(diào)試代碼
- }else {}
- }
- }
3.把變量和表達式轉(zhuǎn)換成字符串
可是使用字符串運算符來實現(xiàn)轉(zhuǎn)換輸出定義
#define PR(x) cout<<#x”=”<
4.c語言的assert()
該宏在 中,,當使用assert時候,給他個參數(shù),即一個判讀為真的表達式。預(yù)處理器產(chǎn)生測試該斷言的代碼,如果斷言不為真,則發(fā)出一個錯誤信息告訴斷言是什么以及它失敗一會,程序會終止。
#include< assert>
using namsapce std;
int main()
{
int i=100;
assert(i!=100); //Fails
}
當調(diào)試完畢后在#include 前加入#define NDEBUG即可消除紅產(chǎn)生的代碼
}
C++代碼和調(diào)試
本部分教程主要介紹了良好的Visual C++環(huán)境風格、如何書寫安全的代碼以及在Visual C++環(huán)境下的程序調(diào)試技術(shù),這些內(nèi)容對于新員工從學生成長為真正的程序員,逐步參與實際項目的開發(fā)工作,以及閱讀第三方代碼非常重要。
1 規(guī)范易懂的代碼
現(xiàn)階段軟件開發(fā),都要依靠團隊的合作。程序員不再是個人英雄主義的代名詞,程序員一方面要依賴大量其他程序員完成的代碼,一方面又提供大量代碼給其他人使用,代碼實際上具備了兩個要素:首先是可靠的提供某種功能,其次是清楚地表達作者的思想。任何交流都必須有一定的規(guī)范才能進行,體現(xiàn)在代碼中就是規(guī)范易懂。另外,規(guī)范易懂的代碼才是可重復(fù)使用的,規(guī)范的代碼具有更長的壽命,具有更好的可維護性,也更方便后期的擴展。
1.1 好代碼的幾個特征
怎么樣的代碼才算規(guī)范易懂,體現(xiàn)在細節(jié)上會有無數(shù)的爭論,實際上無論風格和習慣如何,好的代碼具有幾個共同的特征:
1. 良好的命名:好的變量名和函數(shù)名,讓閱讀代碼的人馬上就知道該變量或者函數(shù)的作用,很容易就能理解程序的大概結(jié)構(gòu)和功能。程序員有必要理解匈牙利命名法。
2. 一致性:一致性帶來更好的程序,一致的代碼縮進風格能夠顯示出代碼的結(jié)構(gòu),采用何種縮進風格并不重要,實際上,特定的代碼風格遠沒有一致的使用它們重要。
3. 注釋:注釋是幫助程序讀者的一種手段,程序作者也是未來的程序讀者之一。最好的注釋是簡潔地點明程序的突出特征,或是提供一種概觀,幫助別人理解程序;但如果注釋只是說明代碼已經(jīng)講明的事情,或者與代碼矛盾,或者以精心編排的形式迷惑干擾讀者,那就是幫了倒忙。
1.2 養(yǎng)成好習慣
前面已經(jīng)提過,特定的代碼風格遠沒有一致的使用他們重要,所以,把過多的精力放到A or B的選擇上是浪費時間,你要做的是堅持。如何書寫規(guī)范易懂的代碼,如何養(yǎng)成良好的習慣,下面是一些提示。
1. 按照匈牙利命名法給變量和函數(shù)命名。
2. 遵循國際流行的代碼風格。
3. 寫代碼的同時就遵循你的命名規(guī)范和書寫風格,千萬不能事后補救。
4. 利用工具(Parasoft C++ Test)檢查你的代碼,評估一下自己形成良好的習慣沒有。
5. 堅持不懈直到養(yǎng)成習慣。
2 編寫安全可靠的代碼
在大型應(yīng)用軟件系統(tǒng)中,各個代碼片段共同構(gòu)成完整的系統(tǒng),Visual C++環(huán)境間的交互非常頻繁,程序崩潰往往并不在錯誤發(fā)生的時候就發(fā)生,而是延遲了一段時間,經(jīng)過數(shù)個函數(shù)之間的中轉(zhuǎn)后才發(fā)生,此時定位和查找錯誤非常費時費力,如何才能及時反映程序中的錯誤。
如何在代碼中避免一些幼稚的語義錯誤呢?一個函數(shù)往往會被其他程序員拿來使用,但是他怎么能夠正確的使用其他人編寫的函數(shù)呢?這部分內(nèi)容能夠(部分)幫助解決這些問題。
2.1 契約編程
契約編程(Design by Contract)的思想在C++圣經(jīng)級的著作,C++之父Bjarne Stroustrup的《C++程序設(shè)計語言》中略微提到過,OO領(lǐng)域的圣經(jīng)級著作《面向?qū)ο筌浖?gòu)造》以大篇幅闡釋了契約編程,現(xiàn)在越來越多的軟件開發(fā)人員認識到契約編程的重要性,并逐步地在實際工作中采用契約編程。
對契約編程簡單的解釋是:對實現(xiàn)的代碼塊(函數(shù)、類)通過規(guī)定調(diào)用條件(約束)和輸出結(jié)果,在功能的實現(xiàn)者和調(diào)用者之間定義契約。
具體到我們的工作,開發(fā)人員應(yīng)該對完成的每個函數(shù)和類,定義契約。契約編程看似平淡無奇,對程序開發(fā)沒有什么具體的幫助,實際上,契約編程在開發(fā)階段就能夠最大程度的保證軟件的可靠性和安全性。#t#
在實際工作中,每當你需要使用其他程序員提供的模塊,你并不知道如何調(diào)用,也不知道你傳入的參數(shù)是否合法,有時候?qū)τ诠δ苣K的處理結(jié)果也不敢相信。這些本來應(yīng)該很明顯的信息因為模塊提供者沒有顯式的提供,
造成了調(diào)用者只能忐忑不安的摸著石頭過河,浪費了大量時間,而且為了讓自己的代碼更安全可靠,在代碼中做了大量的判斷和假設(shè),造成代碼結(jié)構(gòu)的破壞和執(zhí)行效率的損失,最后,調(diào)用者依舊不能確保自己的調(diào)用是正確的。而契約編程通過嚴格規(guī)定函數(shù)(或類)的行為,在功能提供者和調(diào)用者之間明確了相互的權(quán)利和義務(wù),避免了上述情況的發(fā)生,保證了代碼質(zhì)量和軟件質(zhì)量。
Visual C++環(huán)境主動調(diào)試
主動調(diào)試指在寫代碼的時候,通過加入適量的調(diào)試代碼,幫助我們在軟件錯誤發(fā)生的時候迅速彈出消息框,告知開發(fā)人員錯誤發(fā)生地點,并中止程序。這些調(diào)試代碼只在Debug版中有效,當經(jīng)過充分測試,發(fā)布Release版程序的時候,這些調(diào)試代碼自動失效。
主動調(diào)試和契約編程相輔相成,共同保證軟件開發(fā)的質(zhì)量。契約編程相當于經(jīng)濟生活中簽訂的各種合同,而主動調(diào)試相當于某方不遵守合同時采取的法律懲罰措施。
各種開發(fā)語言和開發(fā)工具都提供這些調(diào)試語句,標準C++提供了assert函數(shù),MFC提供了ASSERT調(diào)試宏幫助我們進行主動調(diào)試,在實際工作中,建議統(tǒng)一使用MFC的ASSERT調(diào)試宏。
網(wǎng)站欄目:如何更好的搭建VisualC++環(huán)境
路徑分享:http://www.5511xx.com/article/dhicddg.html


咨詢
建站咨詢
