C语言ASSERT宏

一、assert函数的目的:

断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位,并且输出信息很详细,可以很好地解决大多数C语言编译器错误信息输出不详细的问题

 

二、assert宏的原型,assert在哪里定义的

C语言中,assert断言的原型定义在<assert.h>文件中。assert是一个宏定义,并不是一个函数。其作用是先计算表达式 expression ,如果expression的值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。

断言的消息会显示库依赖,但是它也包含一下信息,源文件的名字,处于哪一行,在哪儿发生的,一般的格式如下:

Assertion failed: expression, file filename, line line number

 

三、assert使用范围

1、放在函数入口,对入口参数进行合法性检查(如strcpy函数中用assert函数检查入口参数是否为NULL)

2、将assert(0)放在预计正常 下不会出现的地方(一旦出现肯定是异常出错了)

3、放在前置条件必须满足、后置条件必须满足、不变条件必须满足的场合

 

四、assert使用原则

1、一个断言只能检测一个条件。

2、断言检查只是辅助条件,不能替代条件检测。

3、不能使用改变环境语句的使用。

4、频繁使用断言也会降低效率。并且它的强制停止所以不适合嵌入式程序和服务器,但也可以改写只报错误而不停止,即不调用abort()。

5、不要浪费别人的时间—详细说明不清楚的断言;消除所做的隐式假定,或者利用断言检查其正确性例如:有时候我们会不自觉的认为一个字节占8位,或者说一个long型占据4个字节,这些都是对编译程序或操作系统做的一些假定。这使得我们需要在程序中使用断言例如ASSERT(sizeof(long)==4&&CHAR_BIT==8)。

6、断言是进行调试检查的简单方法。要使用断言来检查绝对不应该发生的非法情况,不要混淆非法情况和错误情况,错误情况是需要在最终产品中处理的。

7、利用断言对函数的参数进行确认,并且当程序员使用了无定义特性时向程序员报警。

8、当编写函数时,应反复问自己做了哪些假定,一旦确定了相应的假定,就要使用断言对所做的假定进行检验,或者重新编写代码去除假定。

 

五、assert使用举例

1、

/* assert example */

#include <stdio.h>      /* printf */

#include <assert.h>     /* assert */


void print_number(int* myInt) {

      assert(myInt != NULL);

      printf("%d\n", *myInt);

}


int main()

{

      int a = 10;

      int * b = NULL;

      int * c = NULL;


      b = &a;


      print_number(b);

      print_number(c);


      system("pause");

      return 0;

}

执行结果如下:

 

2、用asset检查入口参数
 

   void *MemCopy(void *dest, const void *src, size_t len)

    {

        assert(dest != NULL && src !=NULL);

        char *tmp_dest = (char *)dest;

        char *tmp_src = (char *)src;

        while(len --)

                *tmp_dest ++ = *tmp_src ++;

        return dest;

    }

体验这个函数中asset的作用

 

六、用户定义自己的宏assert

以后在更新吧,这里还没有看到/写出很好的代码

 

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_42445727/article/details/84898278