码迷,mamicode.com
首页 > 编程语言 > 详细

c语言之assert的使用

时间:2014-09-09 13:22:58      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:c   assert   

assert



作用



程序中关键的地方可以通过assert这个宏来断言。如果断言非真,程序停止,标准错误输出一条具体的错误信息。

但在实战中,程序直接停止是很不好的现象,因此断言只在调试程序使用。

bubuko.com,布布扣





bubuko.com,布布扣






NDEBUG宏



为了在调试中方便使用assert,而在不需要时容易停掉assert的工作,于是有了NDEBUG宏来规定assert的行为。如果定义了这个宏,assert不会起作用。


#ifdef NDEBUG
#define assert(x) ((void)0)
#else
...


bubuko.com,布布扣





头文件的特性


assert.h头文件和别的头文件不同,不具有幂等性。

幂等性就是包含该文件一次到多次,效果相同。



但assert.h文件包含多次,却不一定相同。

bubuko.com,布布扣
一开始就取消了原有的 assert宏的定义


因此打开断言要写成  
#undef NDEBUG
#include<assert.h>

关闭断言要写成
#define NDEBUG
#include<assert.h>




测试


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


#define NDEBUG
#include <assert.h>
void t1(void)
{
    int i = 0;
    
    assert(i == 0);
    assert(i == 1);
}


#undef NDEBUG
#include <assert.h>
void t2(void)
{
    int j = 0;
    
    assert(j == 0);
    assert(j == 1);
}

#define NDEBUG
#include <assert.h>

int main(void)
{
    int i = 1;
    assert(i == 0);
    t1();
    printf("hello world\n");
    t2();
}


t1函数开始时,取消了断言,因此执行t1不会停止。
t2函数开始时,实行了断言,因此最后t2会停止在 j==1句时。
main函数虽然断言为假,但开始时取消了断言,因此不会停止。




输出结果为:

bubuko.com,布布扣










c语言之assert的使用

标签:c   assert   

原文地址:http://blog.csdn.net/wangxiaobupt/article/details/39135993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!