1. 程式人生 > >C語言assert關鍵字

C語言assert關鍵字

這是C語言的assert.h標頭檔案的定義

#include "cvidef.h"                                                               
#include "cvirte.h"                                                               
                                                                                  
#ifndef _ASSERT_H_                                                                
#define _ASSERT_H_                                                                
                                                                                  
#ifdef __cplusplus                                                                
    extern "C" {                                                                  
#endif                                                                            
                                                                                  
#undef assert                                                                     
                                                                                  
#ifdef NDEBUG                                                                     
#define assert(exp) ((void)  0)                                                   
                                                                                  
#else                                                                             
void CVIANSI _assert(char *, char *, int);                                        
                                                                                  
#define assert(exp) ((exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__))        
#endif                                                                            
                                                                                  
#ifdef __cplusplus                                                                
    }                                                                             
#endif                                                                            
                                                                                  
#endif /* _ASSERT_H_ */
關鍵是看 這句
#define assert(exp) ((exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__))
1,如果 exp為真,則返回0,不進行任何操作。
2,如果exp為假,則呼叫_assert(#exp, __FILE__, __LINE__)
_assert(#exp, __FILE__, __LINE__) 
就是列印 assert斷言的內容: 主要是 exp的字串, 當前檔案的名字, 當前行數。

具體例子如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define DEBUG
//#undef DEBUG

/**
assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義:
#include <assert.h>
void assert( int expression );
assert的作用是現計算表示式 expression ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,
*/

void main(){

#ifdef DEBUG
    printf("rong\n");
#endif

    
    fprintf(stderr,"error\n");
    assert(1);
    int a = 1;
    assert(a == 1);

}
編譯與執行:

當assert()內為真時:

-bash-4.1$ gcc -o a Demo.c  
-bash-4.1$ ./a
rong
error
-bash-4.1$ 
當assert()內為假時:
-bash-4.1$ gcc -o a Demo.c  
-bash-4.1$ ./a
rong
error
a: Demo.c:24: main: Assertion `0' failed.
已放棄 (core dumped)
-bash-4.1$