1. 程式人生 > >C語言:assert()函式用法總結

C語言:assert()函式用法總結

  assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義:

#include <assert.h>void assert( int expression );

  assert的作用是現計算表示式 expression ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort 來終止程式執行。請看下面的程式清單badptr.c:

複製程式碼
#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 ); //程式永遠都執行不到這裡來return0; }
複製程式碼

[[email protected] error_process]# gcc badptr.c 
[[email protected] 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不能代替條件過濾。

出處:http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html

相關推薦

C語言assert()函式用法總結

  assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: #include <assert.h>void assert( int expression );   assert的作用是現計算表示式 expression ,如果

C/C++ assert()函式用法總結

轉自:https://www.cnblogs.com/lvchaoshun/p/7816288.html   assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行。 原型定義: #include <assert.

C語言幾個函式用法小結

1.char *ultoa(unsigned long value,char *string,int radix)  將無符號整型數value轉換成字串並返回該字串,radix為轉換時所用基數  2.char *ltoa(long value,char *string,i

C語言const關鍵字的用法總結

一、const修飾普通變數 1、說 const 定義的是變數,但又相當於常量;說它定義的是常量,但又有變數的屬性,所以叫常變數。用 const 定義常變數的方法很簡單,就在通常定義變數時前面加 const 即可,如: const int a = 10; int const a = 10;

C語言理解函式指標陣列和定義

函式指標陣列和定義 陣列是一個存放相同型別資料的儲存空間,那我們已經學習了指標陣列,比如:     int *arr[10];//陣列的每個元素是int* 那要把函式的地址存到一個數組中,那這個陣列就叫函式指標陣列,那函式指標的陣列如何定義呢?   int (

C語言分段函式

題目: #include <math.h> int main() { double x,y; scanf("%lf",&x); if (x<0) y=0.5*(-x); else if (x<1

assert()函式用法總結

assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: #include <assert.h> void assert( int expression );  assert的作用是現計算表示式

C語言通過函式指標和引數來呼叫函式

C語言可以通過函式指標來呼叫函式,可以將要呼叫的函式名儲存到陣列中。這樣我們可以通過引數來直接呼叫函數了。 #include <stdio.h> #define FUNCTIONSIZE 2 typedef unsigned char uint8_t;

C語言strlen()函式易錯點

<pre name="code" class="cpp">/* strlen函式解析 */ # include<stdio.h> # include<malloc.h> # include<string.h> int ma

C語言使用函式實現兩個數的交換。

此題的解決思路為:建立一個Swap函式,引數為a和b,函式內部建立一個臨時變數tmp,用於交換兩個數。 但需要注意的是:函式傳參的過程中需要注意,形參是實參的一份臨時拷貝,形參的改變不會影響實參,所以此時函式傳參的時候需要傳遞實參的地址(&a),即傳址呼叫,在接收部

C語言利用函式法進行冒泡法排序

題目來源:大工慕課 連結 作者:Caleb Sung 參考程式碼 #include<stdio.h> #include<stdlib.h> #include<ti

三十四 assert()函式用法總結

 assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: #include <assert.h>void assert( int expression );   assert的作用是現計算表示式 

C語言巨集定義高階用法總結

1、巨集定義函式頭 或字串連結   #define Function(name) void Func##name(void) 使用舉例  Function(mytest) { } 編譯器回編譯成 void Funcmytest(void) { } 2、多行巨集定義並在巨集定

C語言檔案函式 fopen(),fclose(),fwrite(),fread()

1."r" = "rt" 開啟一個文字檔案,檔案必須存在,只允許讀 2."r+" = "rt+" 開啟一個文字檔案,檔案必須存在,允許讀寫 3."rb" 開啟一個二進位制檔案,檔案必須存在,只允許讀 4.“rb+” 開啟一個二進位制檔案,檔案必須存在,允許讀寫 5."w" = “wt” 新建一個文字

總結C語言字元檢測函式isalnum、isalpha...

  前言:最近一直在刷leetcode的題,用到isalnum函式,用man手冊查找了一下,總共有13個相關函式如下:   #include <ctype.h> int isalnum(int c); int isalpha(int c); int isascii(i

C語言常用的字串處理函式總結

第一次筆記:關於C語言積累感謝大家閱覽,記得看完點贊啦!常用的字串處理函式     C語言編譯系統中提供了很多有關字串處理的庫函式,這些庫函式為字串處理提供了方便,下面總結下幾種有關字串處理的函式。一、輸出字串函式puts:格式:puts(字元陣列名) ;功能:puts函式用

C語言sscanf函式用法總結(一) 正則表示式

#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; void sscanf_te

C語言如何用函式實現2-100以內素數的判別

C語言中如何用函式實現2-100以內素數的判別 #include<stdio.h> #include<math.h> int isPrime(int);//函式宣告 int main() { int i; for(i = 2; i <= 100;

c語言自定義函式,10月28日總結

現在時間23點34分,我想看看我幾點能完成   今天總結自定義函式的使用,先從最基礎的地方開始 1.形參實參 在定義函式的時候,函式大多數都有引數,在被主調函式需要傳遞資料給函式的引數 函式定義時用的變數叫形參 傳遞給函式的中形參值或變數叫實參 int m

C語言檔案操作函式總結——超詳細

版權宣告 本文原創作者:谷哥的小弟 作者部落格地址:http://blog.csdn.net/lfdfhl 檔案與流 在C語言中有三種標準流: stdin(standard input stream)標準輸入流。在大多數環境中為從鍵盤輸入;scanf( )和getchar( )