c語言中斷言的意思,c語言斷言assert

本文目錄一覽:

c語言中aver什麼意思

英文為「斷言」的意思,而在c語言中,一般都指的是自定義中的「average」的簡寫,自然,指的是「平均」。

C語言中assert斷言的用法?

assert宏的原型定義在assert.h中,其作用是如果它的條件返回錯誤,則終止程序執行。

庫函數: assert.h

原型定義: void assert( int expression );

assert的作用是現計算表達式 expression ,如果其值為假(即為0),那麼它先向stderr打印一條出錯信息,然後通過調用 abort 來終止程序運行。

例程:

#include stdio.h

#include assert.h

#include stdlib.h

int main( void )

{

       FILE *fp;

    

       fp = fopen( “test.txt”, “w” );//以可寫的方式打開一個文件,如果不存在就創建一個同名文件

       assert( fp );                           //所以這裡不會出錯

       fclose( fp );

    

       fp = fopen( “noexitfile.txt”, “r” );//以只讀的方式打開一個文件,如果不存在就打開文件失敗

       assert( fp );                           //所以這裡出錯

       fclose( fp );                           //程序永遠都執行不到這裡來

       return 0;

}

[root@localhost error_process]# gcc badptr.c

[root@localhost error_process]# ./a.out

a.out: badptr.c:14: main: Assertion `fp” failed.

已放棄

使用assert的缺點是,頻繁的調用會極大的影響程序的性能,增加額外的開銷。

在調試結束後,可以通過在包含#include assert.h的語句之前插入 #define NDEBUG 來禁用assert調用,示例代碼如下:

#include stdio.h

#define NDEBUG

#include assert.h

用法總結與注意事項:

1)在函數開始處檢驗傳入參數的合法性

如:

int resetBufferSize(int nNewSize)

{

//功能:改變緩衝區大小,

//參數:nNewSize 緩衝區新長度

//返回值:緩衝區當前長度

//說明:保持原信息內容不變     nNewSize=0表示清除緩衝區

assert(nNewSize = 0);

assert(nNewSize = MAX_BUFFER_SIZE);

}

2)每個assert只檢驗一個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗

不好: assert(nOffset=0 nOffset+nSize=m_nInfomationSize);

好: assert(nOffset = 0);

assert(nOffset+nSize = m_nInfomationSize);

3)不能使用改變環境的語句,因為assert只在DEBUG個生效,如果這麼做,會使用程序在真正運行時遇到問題

錯誤: assert(i++ 100)

這是因為如果出錯,比如在執行之前i=100,那麼這條語句就不會執行,那麼i++這條命令就沒有執行。

正確: assert(i 100)

         i++;

4)assert和後面的語句應空一行,以形成邏輯和視覺上的一致感

5)有的地方,assert不能代替條件過濾

C語言中用ASSERT調試的八大技巧

技巧1:記住ASSERT的定義

對許多開發人員來說,斷言是一個令人困惑的話題,因為它們的許多使用方式與其設計初衷背道而馳。我見到的最清晰的斷言定義是這樣的:

「斷言是在程序某個特定點的一個布爾表達式,除非程序中有缺陷(Bug),否則它的值將為真。」

想要理解上述斷言定義的開發人員應該留意下面三個要點:

·斷言會評估一個表達式是真還是假

·斷言是在代碼中的某個點對系統狀態的一種假設

·斷言會驗證系統假設,如果不為真,就表明代碼中有一個缺陷

技巧2:使用ASSERT驗證函數的先決條件

斷言非常適合契約式設計環境,在這種環境中,開發人員非常清晰地定義了某個函數的先決條件。斷言可以用來檢查該函數的輸入是否滿足先決條件。就拿圖1所示的代碼片段為例:

圖1:函數的先決條件

函數的STate輸入應該在定義的系統狀態範圍內。如果State不是有效的狀態值,那麼它就不是錯誤,而是缺陷!斷言可以用來驗證State是有效的假設,如圖2所示:

圖2:對函數先決條件應用斷言

在State不小於最大值的事件中,斷言表達式將被評估為假,程序於是將停止執行。停止程序執行可以讓開發人員很容易馬上看到哪裡的代碼出錯,而不是過段時間以後才知道。

技巧3:使用ASSERT驗證函數的後置條件

斷言也能用來驗證契約式設計環境中對某個函數輸出的假設。例如,如果前面定義的System_StateSet函數返回SystemState變量,開發人員可以預計它也在期望的範圍之內。斷言可以用來對缺陷進行監視,如圖3所示。

圖3:對函數後置條件應用斷言

開發人員在查看上述代碼後可能會感到這些檢查毫無意義。剛剛才設置好的SystemState怎麼就會出現大於SYSTEM_STATE_MAX的值呢?答案是這確實不應該出現,然而有時候會莫名其妙地發生改變,也許是通過中斷或並行線程,此時斷言可以立即標誌出這個缺陷。

技巧4:不要把ASSERT用於錯誤處理

在記住斷言定義之後,開發人員應該切記:斷言是用於檢測缺陷的,不能用於錯誤處理。錯誤處理是設計用於響應錯誤的用戶輸入和意外的事件順序的軟件。錯誤在系統中預料是會發生的,但僅僅是因為有無效的輸入而並不意味着代碼中有缺陷。錯誤處理應該與缺陷尋找分開來。錯誤使用斷言的一個典型例子是,在試圖打開一個文件用於讀取時去檢查文件的指針,如圖4所示。

圖4:ASSERT的不當使用

讀者可以清楚地看到,試圖打開文件的結果與文件系統的狀態和用戶數據有關,而與代碼中的缺陷一點關係也沒有。開發人員應該編寫錯誤處理程序,而不是用斷言,以便在文件不存在時,錯誤處理程序可以用一些默認可用數據來創建它,以便後續代碼繼續操作。

技巧5:ASSERT僅對開發有意義,不能用於生產

開發ASSERT宏的原始意圖是在開發過程中啟用它,在後面生產時要禁用。可以用NDEBUG宏激活和禁用ASSERT。正確實施的斷言在被禁用後應該對嵌入式系統基本沒有影響。

問題是,如果測試是在斷言啟用的情況下進行的(為了捕捉任何缺陷,應該這樣做),那麼現在禁用斷言將導致交付的產品與測試的產品處於不同的狀態。斷言確實會佔用一些代碼空間,但更重要的是,它們需要佔用少量的時鐘周期來評估它們的布爾表達式。禁用ASSERT可能對具有有限資源的裸機系統的執行時序產生很大影響,從而導致在生產系統中產生新的缺陷。開發團隊需要判斷是否值得冒關閉斷言的.風險。

一種替代方案是保留斷言在激活狀態,而將它們的輸出重定向到一個系統日誌。這樣可以確保任何揮之不去的缺陷很容易被識別,而且能避免中止系統的運行,而中止系統可不是明智之舉。

技巧6:不允許斷言有副作用

ASSERT的默認實現允許開發人員包含一段可執行代碼作為布爾表達式的一部分。舉例來說,一個狀態變量可以被實現為表達式的一部分並傳遞給ASSERT。但如果傳遞給ASSERT的表達式有副作用,也就是說,它會改變嵌入式系統的狀態,那麼禁用斷言將改變系統的行為。開發人員應該確保他們的表達式沒有副作用,否則他們需要冒險在系統中增加只針對產品代碼喚醒的休眠時間缺陷。

技巧7:斷言應該占代碼的1%至3%

每個開發人員對於代碼庫(Code Base)中應該有多少個斷言都有自己的主見。大家一致同意的一個數字是,代碼庫中的斷言佔比應該大於0。斷言為開發人員提供了一種在代碼庫中發生缺陷的時刻發現它的好方法。調試是在開發嵌入式系統中最浪費時間並令人沮喪的事情之一。不管開發人員認可的佔比是1%、3%還是5%,使用斷言肯定對你有利,並會使開發嵌入式軟件變得多少有些趣味。

技巧8:將斷言用作可執行代碼注釋

斷言可以生成極好的注釋!編寫出色的表達式可以確切地告訴開發人員在代碼的某個給定點應該預料發生什麼事情。開發人員應該做好他們斷言的架構,幫助人們更清楚地理解系統中發生的事情,進而幫助減少缺陷。

小結

斷言是一種出色的工具,但有太多的嵌入式軟件開發人員忽視了這一工具。本文討論的八個技巧只是如何正確使用斷言的冰山一角。接下來讀者就可以在測試平台中建立和開始使用斷言,並研究它們在實際的嵌入式系統中是如何工作的。

assert的作用是什麼

一、assert的基本意思是「堅持」「斷言」,即做主觀的、自信的、有說服力的闡述。

二、這種「主張」或「斷言」儘管有時並無憑據,但是要讓別人相信自己的話是有依據的,或要別人對憑據感興趣。

1、讀音:英 [əˈsɜːt]   美 [əˈsɜːrt] 

2、釋義:明確肯定,斷言。

3、語法:assert表示「主張,斷言」,指宣稱某事如此,並不說它是事實,着重主觀自信心。

4、例句:He’s speaking up and asserting himself confidently. 他明確表態,信心十足地闡述自己的觀點。

擴展資料

近義詞:declare

1、讀音:英 [dɪˈkleə(r)]   美 [dɪˈkler] 

2、釋義:宣告,表明,宣稱。

3、語法:declare的基本意思是明確地、清楚地、正式地「宣布,宣告」,多用於官方場合。引申可指「宣稱」「斷言」「申報」等。

4、例句:Your income must be declared on this form必須在這張表格上申報你的收入。

ASSERT在C語言中有什麼作用?

是程序調試很重要的手段,

ASSERT(

f

)

在Debug模式下,每次運行到這裡後會計算括號中的表達式,如果表達式為0,則中斷執行,彈出一個警告框,用戶可選擇「繼續」,「重試」,「忽略」

在Release模式下,這句語句不會被編譯進代碼。

ASSERT一般用於程序內部確認參數的正確性,即調用內部函數的時候,要由調用者保證參數的正確,而被調用函數內部,就可以通過ASSERT來檢查參數是否滿足要求。

原創文章,作者:GDRR,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149178.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GDRR的頭像GDRR
上一篇 2024-11-04 17:51
下一篇 2024-11-04 17:51

相關推薦

  • assert的用法和搭配

    assert是一種常用的調試工具,用於檢查程序的正確性。本文將詳細介紹assert的用法和搭配,包括assert語法、assert與異常處理的結合、assert與單元測試的結合。 …

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論