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

C語言斷言函數(shù)assert()的學(xué)習(xí)筆記

 更新時(shí)間:2021年11月14日 10:54:36   作者:嵌入式@hxydj  
在C語言庫函數(shù)中提供了一個(gè)輔助調(diào)試程序的小型庫,它是由assert()宏組成,本文就詳細(xì)的介紹了一下如何使用,感興趣的可以了解一下

  在C語言庫函數(shù)中提供了一個(gè)輔助調(diào)試程序的小型庫,它是由assert()宏組成,接收一個(gè)整形表達(dá)式作為參數(shù)。如果表達(dá)式的值為假(非零),則assert()宏就在標(biāo)準(zhǔn)錯(cuò)誤流(stderr)中寫入一條錯(cuò)誤信息,并調(diào)用abort()函數(shù)終止程序。

  下面通過一個(gè)簡單的例子來看一下assert()的用法。

int main()
{
	int n = 1;
	assert(n>=0);
	printf("%d \r\n",n);
	system("pause");
	return 0;
}

  在assert()中表達(dá)式判斷的條件是 n > 0 ,那么當(dāng)整形變量n的值小于0時(shí),就說明表達(dá)式為假,斷言函數(shù)就會(huì)起作用。這里先試一下正常情況,將n的值設(shè)置為1,輸出結(jié)果如下:

在這里插入圖片描述

  接下來將 n 的值改為 -1,繼續(xù)測(cè)試。

在這里插入圖片描述

  此時(shí)程序異常終止了。下面詳細(xì)分析一下,這個(gè)函數(shù)的執(zhí)行過程。

在這里插入圖片描述

  在assert.h頭文件中可以查看到assert()的原型,這里有兩個(gè)原型,一個(gè)是當(dāng)定義了 _UNICODE 或者 UNICODE 時(shí)調(diào)用的是第一個(gè)assert(),當(dāng)沒有定義時(shí),調(diào)用的是第二個(gè)assert()。由于在頭文件中沒有定義 _UNICODE 或 UNICODE,所以這里調(diào)用的是第二個(gè)assert。下面開始分析這條宏定義語句。

#define assert(_Expression) (void) 	((!!(_Expression)) ||  (_assert(#_Expression,__FILE__,__LINE__),0))

void __cdecl _assert (const char *_Message, const char *_File, unsigned _Line);

  首先 assert 中傳入了一個(gè)參數(shù) _Expression ,接著還有有一條語句,里面有兩部分由或運(yùn)算符連接。對(duì)于或運(yùn)算符 || 來說,當(dāng)?shù)谝粋€(gè)條件成立時(shí)就不會(huì)執(zhí)行第二個(gè)條件,只有當(dāng)?shù)谝粋€(gè)條件不成立時(shí)才會(huì)執(zhí)行第二條語句。

((!!(_Expression)) ||  (_assert(#_Expression,__FILE__,__LINE__),0))

  首先來看第一個(gè)判斷條件 (!!(_Expression)),給傳入的參數(shù)取了兩次非,也就相當(dāng)于變量本身,當(dāng) _Expression 為真時(shí),就不會(huì)執(zhí)行 第二個(gè)條件,只有 _Expression 為假時(shí),才會(huì)執(zhí)行第二個(gè)條件。在程序中當(dāng) n > 0 成立時(shí)就不會(huì)執(zhí)行第二個(gè)條件,當(dāng) n > 0 不成立時(shí),才會(huì)執(zhí)行第二條語句,所以在上面測(cè)試中,當(dāng) n = -1 時(shí),程序才會(huì)異常終止。

  接下來看第二個(gè)條件 (_assert(#_Expression,FILE,LINE),0) 這是一個(gè)函數(shù),它的原型是:

void __cdecl _assert (const char *_Message, const char *_File, unsigned _Line);

  這個(gè)函數(shù)有三個(gè)參數(shù),根據(jù)這三個(gè)參數(shù)的名稱大概可以推斷出,第一個(gè)參數(shù)是用來存儲(chǔ)信息內(nèi)容,第二個(gè)參數(shù)是用來表示當(dāng)前文件的詳細(xì)信息,第三個(gè)參數(shù)表示代碼中那一行出錯(cuò)。

在這里插入圖片描述

  這三個(gè)參數(shù)和控制臺(tái)打印的內(nèi)容相符合,Program 后面跟著的是當(dāng)前運(yùn)行的可執(zhí)行文件路徑,F(xiàn)ile 后面跟著的是報(bào)錯(cuò)的文件路徑,Line 后面跟著的是 出錯(cuò)的具體位置,說明在 test6.c 文件中第16行程序出現(xiàn)了錯(cuò)誤,最后一行提示出錯(cuò)的表達(dá)式 為 n>=0 ,說明變量n 大于等于0這個(gè)條件不成立,也就是當(dāng)前變量n的值小于0,所以引發(fā)了程序異常。

  通過上面的分析可以看出,assert()對(duì)應(yīng)調(diào)試程序來說很有幫助,像這種隱藏在代碼中的錯(cuò)誤在編譯程序的時(shí)候,編譯器是檢測(cè)不出來的,只有當(dāng)程序執(zhí)行的時(shí)候才會(huì)發(fā)現(xiàn)。所以通過assert()來檢測(cè)表達(dá)式就可以快速的定位程序的bug。

  加入不想使用assert()來檢測(cè)了,不需要修改代碼,只需要在assert.h中定義 NDEBUG就行了。

在這里插入圖片描述

 在assert.h中添加宏定義,繼續(xù)運(yùn)行程序。

在這里插入圖片描述

  此時(shí)n的值為-1,但是程序正常的打印出了-1,并沒有報(bào)錯(cuò)。說明assert()不檢測(cè)錯(cuò)誤了。這個(gè)從頭文件中也可以看出。

在這里插入圖片描述

  當(dāng)定義了NDEBUG之后,**assert(_Expression)**執(zhí)行的具體函數(shù)就變成了 ((void)0),也就是啥也不干了。所以當(dāng)在頭文件中定義了NDEBUG之后,assert()的檢測(cè)功能就自動(dòng)失效了。這樣在調(diào)試程序的時(shí)候,只需要一條語句就可以開啟或者關(guān)閉調(diào)試信息輸出了。

到此這篇關(guān)于C語言斷言函數(shù)assert()的學(xué)習(xí)筆記的文章就介紹到這了,更多相關(guān)C語言斷言函數(shù)assert()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 中私有繼承的作用

    C++ 中私有繼承的作用

    這篇文章主要介紹了C++ 中私有繼承的作用的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • C++之std命名空間

    C++之std命名空間

    這篇文章主要介紹了C++之std命名空間使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++中new和delete的介紹

    C++中new和delete的介紹

    今天小編就為大家分享一篇關(guān)于C++中new和delete的介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++ OpenCV讀寫XML或YAML文件的方法詳解

    C++ OpenCV讀寫XML或YAML文件的方法詳解

    XML是一種元標(biāo)記語言。所謂元標(biāo)記,就是開發(fā)者可以根據(jù)自身需要定義自己的標(biāo)記。YAML是一個(gè)可讀性高,用來表達(dá)資料序列的格式。本文將通過C++和OpenCV實(shí)現(xiàn)這兩種文件的讀寫,需要的可以參考一下
    2022-05-05
  • C語言實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的string

    C語言實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的string

    最近工作中使用C語言,但又苦于沒有高效的字符串實(shí)現(xiàn),字符串的拼接和裁剪都很麻煩,而且每個(gè)字符串都需要申請(qǐng)內(nèi)存,內(nèi)存的申請(qǐng)和釋放也很容易出bug,怎么高效的實(shí)現(xiàn)一個(gè)不需要處理內(nèi)存問題并且可以動(dòng)態(tài)擴(kuò)容進(jìn)行拼接和裁剪的string呢?本文就來詳細(xì)講講
    2023-04-04
  • c語言輸出字符串中最大對(duì)稱子串長度的3種解決方案

    c語言輸出字符串中最大對(duì)稱子串長度的3種解決方案

    這篇文章主要介紹了c語言輸出字符串中最大對(duì)稱子串長度的3種解決方案,需要的朋友可以參考下
    2014-03-03
  • C++中allocator類使用示例

    C++中allocator類使用示例

    大家好,本篇文章主要講的是C++中allocator類使用示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • c# 實(shí)現(xiàn)獲取漢字十六進(jìn)制Unicode編碼字符串的實(shí)例

    c# 實(shí)現(xiàn)獲取漢字十六進(jìn)制Unicode編碼字符串的實(shí)例

    下面小編就為大家?guī)硪黄猚# 實(shí)現(xiàn)獲取漢字十六進(jìn)制Unicode編碼字符串的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • C和C++11之enum枚舉的具體使用方法

    C和C++11之enum枚舉的具體使用方法

    這篇文章主要介紹了C和C++11之enum枚舉的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++中inet_pton、inet_ntop函數(shù)的用法

    C++中inet_pton、inet_ntop函數(shù)的用法

    這篇文章主要介紹了C++中inet_pton、inet_ntop函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

莱阳市| 白沙| 望奎县| 读书| 古交市| 东安县| 嘉兴市| 建湖县| 吉林省| 徐闻县| 于都县| 昌黎县| 兴海县| 绩溪县| 柯坪县| 安吉县| 琼结县| 永嘉县| 仲巴县| 潢川县| 鞍山市| 陆良县| 苍山县| 拜城县| 蛟河市| 卢氏县| 水富县| 含山县| 恩平市| 合作市| 巴彦淖尔市| 商丘市| 察雅县| 满城县| 农安县| 广丰县| 平武县| 镇坪县| 巴里| 石林| 荥阳市|