中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言斷言函數assert()的使用方法是什么

發布時間:2021-11-15 09:11:01 來源:億速云 閱讀:233 作者:iii 欄目:開發技術

本篇內容介紹了“C語言斷言函數assert()的使用方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

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

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

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

C語言斷言函數assert()的使用方法是什么

??接下來將 n 的值改為 -1,繼續測試。

C語言斷言函數assert()的使用方法是什么

??此時程序異常終止了。下面詳細分析一下,這個函數的執行過程。

C語言斷言函數assert()的使用方法是什么

??在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 中傳入了一個參數 _Expression ,接著還有有一條語句,里面有兩部分由或運算符連接。對于或運算符 || 來說,當第一個條件成立時就不會執行第二個條件,只有當第一個條件不成立時才會執行第二條語句。

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

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

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

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

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

C語言斷言函數assert()的使用方法是什么

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

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

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

C語言斷言函數assert()的使用方法是什么?

?在assert.h中添加宏定義,繼續運行程序。

C語言斷言函數assert()的使用方法是什么

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

C語言斷言函數assert()的使用方法是什么

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

“C語言斷言函數assert()的使用方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲靖市| 西盟| 霍城县| 济宁市| 南昌市| 万荣县| 武安市| 佛冈县| 丹东市| 丰宁| 五莲县| 玉门市| 武夷山市| 胶南市| 吴川市| 阜平县| 临江市| 青田县| 富川| 天台县| 永吉县| 广德县| 临高县| 乌鲁木齐县| 时尚| 资讯| 抚远县| 招远市| 绥宁县| 余江县| 大兴区| 华容县| 凤山市| 湘乡市| 大城县| 永胜县| 厦门市| 亚东县| 巨野县| 隆德县| 荣昌县|