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( )