欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

相關文章

  • C語言詳細講解strcpy strcat strcmp函數(shù)的模擬實現(xiàn)

    C語言詳細講解strcpy strcat strcmp函數(shù)的模擬實現(xiàn)

    這篇文章主要介紹了怎樣用C語言模擬實現(xiàn)strcpy與strcat和strcmp函數(shù),strcpy()函數(shù)是C語言中的一個復制字符串的庫函數(shù),strcat()函數(shù)的功能是實現(xiàn)字符串的拼接,strcmp()函數(shù)作用是比較字符串str1和str2是否相同
    2022-05-05
  • visual?studio?2022?編譯出來的文件被刪除并監(jiān)視目錄中的文件變更(示例詳解)

    visual?studio?2022?編譯出來的文件被刪除并監(jiān)視目錄中的文件變更(示例詳解)

    這篇文章主要介紹了visual?studio?2022?編譯出來的文件被刪除?并監(jiān)視目錄中的文件變更,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Qt自定義控件實現(xiàn)圓盤進度條

    Qt自定義控件實現(xiàn)圓盤進度條

    這篇文章主要為大家詳細介紹了Qt自定義控件實現(xiàn)圓盤進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • OpenCV基于稠密光流實現(xiàn)視頻跟蹤詳解

    OpenCV基于稠密光流實現(xiàn)視頻跟蹤詳解

    這篇文章主要為大家詳細介紹了OpenCV如何基于稠密光流實現(xiàn)視頻跟蹤功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • C++面試基礎之static關鍵字詳解

    C++面試基礎之static關鍵字詳解

    這篇文章主要給大家介紹了關于C++面試基礎之static關鍵字的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • C/C++實現(xiàn)字符串模糊匹配

    C/C++實現(xiàn)字符串模糊匹配

    本文分別給大家介紹了2個C++在Linux平臺和windows平臺下實現(xiàn)字符串模糊匹配的方法,基本的核心思想都是一樣的,均是使用fnmatch函數(shù),有需要的小伙伴可以參考下。
    2016-04-04
  • C語言實現(xiàn)校運動會項目管理系統(tǒng)

    C語言實現(xiàn)校運動會項目管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)校運動會項目管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++中putchar與getchar函數(shù)的細節(jié)及運用

    C++中putchar與getchar函數(shù)的細節(jié)及運用

    C語言提供putchar函數(shù),用于給終端輸出一個字符;getchar函數(shù),可以從終端接收用戶輸入的一個字符,本文給大家分享C++中putchar與getchar函數(shù)的細節(jié)及運用,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • 利用ace的ACE_Task等類實現(xiàn)線程池的方法詳解

    利用ace的ACE_Task等類實現(xiàn)線程池的方法詳解

    本篇文章是對利用ace的ACE_Task等類實現(xiàn)線程池的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言的堆串操作詳解

    C語言的堆串操作詳解

    大家好,本篇文章主要講的是C語言的堆串操作詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02

最新評論