最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++代碼調(diào)試方式的幾點(diǎn)建議

 更新時(shí)間:2020年08月13日 11:43:52   作者:Dabelv  
這篇文章主要介紹了c++代碼調(diào)試方式的幾點(diǎn)建議,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下

1.代碼調(diào)試的重要性

代碼調(diào)試在程序開發(fā)階段占有舉足輕重的地位,可見代碼調(diào)試的重要性。但是有一點(diǎn)必須強(qiáng)調(diào):程序是設(shè)計(jì)出來(lái)的,而不是調(diào)試出來(lái)的。這是所有程序員必須牢記在心的一條準(zhǔn)則。一個(gè)沒有設(shè)計(jì)或者這幾得很糟糕的程序,無(wú)論怎樣調(diào)試,也不會(huì)成為一個(gè)合格的程序。

程序有著良好的設(shè)計(jì)的前提下,軟件開發(fā)的過(guò)程中,編碼錯(cuò)誤在所難免。所有程序可能出現(xiàn)的錯(cuò)誤可分為兩類:語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤。調(diào)試通常是指在消除了語(yǔ)法錯(cuò)誤之后,發(fā)現(xiàn)程序中的邏輯錯(cuò)誤的過(guò)程。對(duì)C/C++程序進(jìn)行調(diào)試,有這樣集中常用的手段。它們既可以單獨(dú)使用,也可以配合使用。

2. 代碼調(diào)試方式的幾點(diǎn)建議

2.1使用打印語(yǔ)句

這是最樸素,也是最直接的方法。程序的運(yùn)行可以看成是一組變量(狀態(tài))不斷變化的過(guò)程,這個(gè)過(guò)程就是數(shù)據(jù)處理的過(guò)程。如果程序的最終結(jié)果不對(duì),那么我們必須考慮這一組狀態(tài)什么時(shí)候出現(xiàn)了問(wèn)題,而查看中間結(jié)果就成了一種最有效的手段。

因此,不要過(guò)分迷信功能強(qiáng)大的調(diào)試工具。在大部分情況下,程序出現(xiàn)的問(wèn)題都是一些小問(wèn)題。而正是這些小問(wèn)題,卻造成了大麻煩。程序員可以通過(guò)對(duì)最有可能出錯(cuò)的代碼附近使用簡(jiǎn)單的printf()語(yǔ)句或cout<<…語(yǔ)句來(lái)輸出中間結(jié)果,查看異常情況。

2.2使用調(diào)試標(biāo)記

在調(diào)試程序的時(shí)候使用相應(yīng)的輔助代碼(如輸出中間結(jié)果等),在調(diào)試完成之后隱藏這些代碼,是一種常用的調(diào)試策略。

這種策略可以借助于#define、#ifdef、#endif這三個(gè)與編譯指令來(lái)實(shí)現(xiàn)。具體地說(shuō),就是在調(diào)試程序的時(shí)候,利用編譯器的命令行參數(shù)定義調(diào)試標(biāo)記(相當(dāng)于程序中用#define定義的宏),然后再#ifdef和#endif之間包含相應(yīng)的調(diào)試代碼就可以了。當(dāng)程序最終調(diào)試完成后,在生成發(fā)行版時(shí),只要在編譯器命令行參數(shù)中不再提供調(diào)試標(biāo)記,程序中的調(diào)試代碼就會(huì)消失。常用的調(diào)試標(biāo)記為_DEBUG(在VC++ 2012)中,編譯器調(diào)試版的程序是會(huì)缺省定義宏_DEBUG??疾烊缦鲁绦?。

#include <iostream>
using namespace std;

int main()
{
	int i=5;
#ifdef _DEBUG
	cout<<i<<endl;
#endif
	cout<<"Hello World!"<<endl;
}

在調(diào)試程序的時(shí)候,會(huì)執(zhí)行#ifdef和#endif之間的語(yǔ)句。當(dāng)調(diào)試完成之后,由于調(diào)試標(biāo)記_DEBUG失去定義,從而隱藏調(diào)試代碼。

2.3使用調(diào)試變量

與使用調(diào)試標(biāo)記的方法類似,可以在運(yùn)行時(shí)設(shè)置一個(gè)供調(diào)試用的bool型變量,它的值決定了特定調(diào)試代碼的開放和關(guān)閉。并且可以通過(guò)程序的命令行參數(shù)來(lái)控制該變量的開關(guān)。上面的程序經(jīng)過(guò)修改如下。

#include <iostream>
#include <string>
using namespace std;

bool debug;

int main(int argc,char* argv[])
{
	int i=5;
	for(int j=0;j<argc;++j)
	{
		if(string(argv[j])=="debug=on")
		{
			debug=true;
		}
	}
	if(debug)
	{
		cout<<i<<endl;
	}
	cout<<"Hello World!"<<endl;
}

程序通過(guò)命令行啟動(dòng)時(shí),只要在命令行參數(shù)中指明debug=on,就可以輸出調(diào)試信息。否則,只是輸出程序“正?!边\(yùn)行的部分。這樣就具有較高的靈活性。

2.4使用內(nèi)置的調(diào)試宏

在程序調(diào)試的過(guò)程中,經(jīng)常希望知道當(dāng)前運(yùn)行的是哪個(gè)模塊小的哪個(gè)函數(shù),在源文件中是第幾行等等。如果手工添加這些信息,無(wú)疑會(huì)給程序員帶來(lái)很大的負(fù)擔(dān)。因此,C++提供了幾個(gè)宏,他們分別是__FILE__、__FUNCTION____LINE__,可以利用它們“自動(dòng)“獲取有關(guān)模塊、函數(shù)和行的信息??疾烊缦鲁绦?。

#include <iostream>
using namespace std;

void func1()
{
	cout<<__FILE__<<endl;
}

void func2()
{
	cout<<__FUNCTION__<<endl;
}

void func3()
{
	cout<<__LINE__<<endl;
}

int main(int argc,char* argv[])
{
	func1();
	func2();
	func3();
}

在本人的機(jī)器上輸出如下信息:

e:\lvlv_study\synchronousfile\school\2015.10.23\programming\debug\main.cpp
func2
13

另外還可以使用assert()宏來(lái)進(jìn)行斷言。assert是一個(gè)只在調(diào)試版本下起作用的宏。另外,用戶也可以定義自己的宏輔助來(lái)完成調(diào)試任務(wù)。例如下面的紅可以用來(lái)顯示變量的值,而且變量的名字會(huì)一同顯示出來(lái):

#define PR(x) cout<<#x”=”<<x;

這是利用#對(duì)宏的參數(shù)進(jìn)行字符串化的處理。

2.5利用調(diào)試工具進(jìn)行調(diào)試

利用集成開發(fā)環(huán)境進(jìn)行調(diào)試也是一種攢則。可以在IDE中設(shè)置斷點(diǎn)、但不調(diào)試、產(chǎn)看變量的內(nèi)存的值、動(dòng)態(tài)修改變量的值以改變程序的執(zhí)行路徑等。每一種具體的調(diào)試工具,其調(diào)試命令和方法都有差異,使用時(shí)要參閱相應(yīng)的文檔(如MSDN等)。

要說(shuō)明的一點(diǎn)是,使用工具進(jìn)行調(diào)試與基于打印輸出的調(diào)試除了在使用的方便程度上有所差異外,在某些特殊的情況下,不能活著很難用工具進(jìn)行某些程序的調(diào)試。如在Windows程序設(shè)計(jì)中,要調(diào)試與窗口重繪的有關(guān)代碼,就不適合用IDE進(jìn)行調(diào)試。原因是焦點(diǎn)從IDE窗口轉(zhuǎn)到應(yīng)用程序的窗口時(shí),會(huì)引發(fā)新的重繪動(dòng)作,導(dǎo)致程序運(yùn)行陷入“死循環(huán)“。Linux環(huán)境下,進(jìn)行代碼的調(diào)試,我們可以借助于強(qiáng)大的調(diào)試工具gdb,其可以快速的定位到程序出錯(cuò)的位置,如使用bt或where命令可以快速找到程序出現(xiàn)core dumped的位置。

3.總結(jié)

使用各種調(diào)試的手段或工具,其目的是盡早的發(fā)現(xiàn)已經(jīng)存在于程序中的錯(cuò)誤。與此相關(guān)聯(lián)的問(wèn)題是,如何較少的引入錯(cuò)誤、如何有策略地使用調(diào)試手段。給出幾條如下建議。

(1)采用良好的變成風(fēng)格。比如,用統(tǒng)一的規(guī)范為變量、函數(shù)和類型命名。程序的基本單位(如函數(shù))的規(guī)??刂圃谝欢ǚ秶畠?nèi)(如100行),鋸齒形編碼,合理的注釋等等。

(2)進(jìn)行代碼復(fù)查。這是Watts S Humphery領(lǐng)導(dǎo)的研究小組指定的PSP(Personal Software Process,即個(gè)人軟件過(guò)程)規(guī)范中提倡的做法。在編譯之前就進(jìn)行代碼復(fù)查,比直接進(jìn)行編譯更能有效地發(fā)現(xiàn)程序缺陷。

(3)對(duì)歷史數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和跟蹤。每個(gè)程序員的只是背景和工作習(xí)慣各不相同,通過(guò)統(tǒng)計(jì)歷史上個(gè)人最容易出現(xiàn)哪些類型的編程錯(cuò)誤,以便在將來(lái)有針對(duì)性地排查,是一種有效的提高程序質(zhì)量的做法。

以上就是c++代碼調(diào)試方式的幾點(diǎn)建議的詳細(xì)內(nèi)容,更多關(guān)于C++代碼調(diào)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言超詳細(xì)分析多進(jìn)程的概念與使用

    C語(yǔ)言超詳細(xì)分析多進(jìn)程的概念與使用

    在一個(gè)項(xiàng)目中并發(fā)執(zhí)行任務(wù)時(shí)多數(shù)情況下都會(huì)選擇多線程,但有時(shí)候也會(huì)選擇多進(jìn)程,例如可以同時(shí)運(yùn)行n個(gè)記事本編輯不同文本,由一個(gè)命令跳轉(zhuǎn)到另外一個(gè)命令,或者使用不同進(jìn)程進(jìn)行協(xié)作
    2022-08-08
  • C++學(xué)習(xí)之線程詳解

    C++學(xué)習(xí)之線程詳解

    多線程是開發(fā)中必不可少的,往往我們需要多個(gè)任務(wù)并行,就需要多線程開發(fā)。本文將帶大家深入學(xué)習(xí)一下C++中的常用的一些知識(shí)點(diǎn),感興趣的同學(xué)可以了解一下
    2021-12-12
  • C++四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值

    C++四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值

    這篇文章主要介紹了C++的四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值,文中介紹的非常詳細(xì),對(duì)學(xué)習(xí)C語(yǔ)言有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2023-04-04
  • C++ float、double判斷是否等于0問(wèn)題

    C++ float、double判斷是否等于0問(wèn)題

    這篇文章主要介紹了C++ float、double判斷是否等于0問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • C語(yǔ)言中#if的使用詳解

    C語(yǔ)言中#if的使用詳解

    #if和#endif是一組同時(shí)使用的,叫做條件編譯指令。#if與#define、#include等指令一樣是由預(yù)處理器這個(gè)強(qiáng)大的工具處理的,預(yù)處理器可以在編譯前處理c程序,這篇文章主要介紹了C語(yǔ)言中#if的使用,需要的朋友可以參考下
    2022-11-11
  • 淺談C++左值引用和右值引用

    淺談C++左值引用和右值引用

    下面小編就為大家?guī)?lái)一篇淺談C++左值引用和右值引用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 關(guān)于在C程序中處理UTF-8文本的方法詳解

    關(guān)于在C程序中處理UTF-8文本的方法詳解

    這篇文章主要給大家介紹了關(guān)于在C程序中處理UTF-8文本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-11-11
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)總結(jié)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)總結(jié)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語(yǔ)言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解

    C語(yǔ)言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解

    枚舉顧名思義就是把所有的可能性列舉出來(lái),像一個(gè)星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間
    2021-11-11
  • C++實(shí)現(xiàn)Huffman的編解碼

    C++實(shí)現(xiàn)Huffman的編解碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Huffman的編解碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評(píng)論

高邑县| 抚州市| 永修县| 灵石县| 东方市| 滨海县| 邮箱| 云和县| 万全县| 卢氏县| 昌宁县| 新沂市| 同德县| 旬阳县| 沂南县| 雷山县| 特克斯县| 莱阳市| 靖宇县| 绥宁县| 肥城市| 茌平县| 晋江市| 贞丰县| 抚远县| 响水县| 青海省| 克什克腾旗| 华亭县| 贵南县| 德惠市| 河北区| 建平县| 博客| 盐城市| 中江县| 巴林右旗| 广灵县| 延吉市| 会宁县| 桂阳县|