c,assert 宏的实现

#define _VAL(x)                #x    //#x的作用就是把x表达式变成一个字符串。(注意 : 不带换行符‘\n‘ , 换行符ascii==10)。如:_STR(i<100)printf("%s\n" , _STR(i<100)) ;会在终端打印 i<100。
下面来实现assert宏,和标准库的同样功能。可打印出错的”文件、行、表达式“。
//massert.c
#include "massert.h"
#include <stdlib.h>
#include <stdio.h>

void _mAssert(char * mesg)
{
    fputs(mesg, stderr);
    fputs("--assertion failed\n", stderr);
    abort();
}
//massert.h
#ifndef NDEBUG
    extern void _mAssert(char *);
    #define _STR(x)  _VAL(x)
    #define _VAL(x)  #x
    #define massert(test)    \
        ((test)? (void)0 : _mAssert(__FILE__ ":" _STR(__LINE__) " " #test))
#else
    #define massert(test)
#endif
//demo1.c
#include "massert.h"

int func1(int i )
{
    massert(i<150);
    return 2*i;
}
//demo2.c
#define NDEBUG
#include "massert.h"

int func2(int i )
{
    massert(i<150);
    return 2*i;
}
//demo.c#include <stdio.h>

extern int func2(int i );
extern int func2(int i );

int main()
{
    if(1){
        printf("11111\n");
        func1(100);
        printf("22222\n");
        func1(200);
    }else{
        printf("33333\n");
        func2(100);
        printf("44444\n");
        func2(200);
    }
    return 0;
}//终端打印结果:
//if(1)
11111
22222
demo1.c:7 i<150--assertion failed
Aborted


//if(0)
33333
44444
实现了assert宏,和标准库的同样功能。可打印出错的”文件、行、表达式“。
时间: 2024-10-08 19:16:21

c,assert 宏的实现的相关文章

assert() 宏用法

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行.请看下面的程序清单badptr.c: #include <stdio.h> #include <

自己编写ASSERT()宏(对调试程序很有帮助)

程序代码: #include <iostream> using namespace std; #define DEBUG #ifndef DEBUG #define ASSERT(x) #else #define ASSERT(x) if(!(x)){ cout<<"错误!ASSERT("<<#x<<")宏函数执行失败;"; cout<<"错误代码出现在第"<< __LINE

(四)静态断言之一 assert 以及 通过宏定义处理文件包含关系

一.断言:运行时与预处理时 断言(assertion)是一种编程常用的手段.想必大家都见过 assert 吧.今天我们就来了解一下它. 通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中,用于排除在设计的逻辑上不应该产生的情况. 比如一个函数总需要输入在一定的范围内的参数,那么程序员就额可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱. 从一些意义上讲,断言并不是正常程序锁必须的,不过对于程序调试来说,通常断言能够帮助程序开发者快速定位那些违反了

C 语言assert使用

1.assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行. 2.使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销.在调试结束后,可以通过在包含#

ASSERT函数

assert宏的原型定义在<assert.h>中,其作用是假设它的条件返回错误,则终止程序运行,原型定义:  #include <assert.h>  void assert( int expression );  assert的作用是现计算表达式 expression ,假设其值为假(即为0),那么它先向stderr打印一条出错信息,  然后通过调用 abort 来终止程序执行. http://www.chongtang.me/index.php/1419 提高程序健壮性之ass

assert使用

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行. 请看下面的程序清单badptr.c:#include <stdio.h>#include <as

C语言中断言ASSERT

我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种"契约式编程",在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句: if(假设成立) { 程序正常运行: } else { 报错&&终止程序!(避免由程序运行引起更大的错误) } 但是这样写的话,就会有无数个if语句,甚至会出现,

C++ assert()的用法

转自:http://blog.csdn.net/yunzhongguwu005/article/details/9178911 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终

C++断言assert

assert宏是在标准库中提供的.它在库文件<cassert>中声明,它能够在程序中測试逻辑表达式,假设指定的逻辑表达式是false,assert()就会终止程序,并显示诊断消息.关闭断言使用#define NDEBUG,该语句会忽略转换单元中的全部断言语句.并且这个指令仅放在#include <cassert>之前才有效.示比例如以下: #include <iostream> #define NDEBUG //关闭断言 #include <cassert>