C/C++/Java 断言assert使用

44 篇文章 2 订阅
10 篇文章 0 订阅

参考:

http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=assert

Assertions in Python - https://www.tutorialspoint.com/python/assertions_in_python.htm

c++ assert() 使用方法 - http://blog.csdn.net/yunzhongguwu005/article/details/9178911


经常在上面这些语言中看到assert的使用,今天统一查阅了一些资料


#######################################################


C中assert使用


参考:

《C Primer Plus》第16章 16.12 断言库

assert.h - http://baike.baidu.com/link?url=0ZjMM4537IyI35TU4UJdCHpvfgdKw7F0fxDPbIfJszRNgGJEqbQkfX3cqC-nIjJIEeFdb0x1ygOy15Pdjmkc4q

static_assert - http://en.cppreference.com/w/c/error/static_assert

assert:http://en.cppreference.com/w/c/error/assert



头文件:

#include <assert.h>


作用:用于辅助调试程序的断言库

位置:在Ubuntu14.04中,可在/usr/include/下找到




函数:

/* void assert (int expression);

   If NDEBUG is defined, do nothing.
   If not, and EXPRESSION is zero, print an error message and abort.  */

#ifdef	NDEBUG

# define assert(expr)		(__ASSERT_VOID_CAST (0))

assert宏接受一个整型表达式作为参数。如果表达式求值为假(非零),assert宏就在标准错误流(stderr)中写入一条错误信息,并调用abort()函数(在stdlib.h中)终止程序。

通常,assert()的参数是一个条件表达式或者逻辑表达式。如果assert()中止了程序,它首先会显示失败的测试,以及包含测试的文件名和行号


程序1:

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

int main(int argc, char* argv[]) {
    printf("Hello World\n");

    assert(3 > 2);

    printf("Hi zj\n");

    int x = 3;
    assert(x != 3);

    printf("over\n");

    return 0;
}



使用assert()的好处:

1.自动标识文件和出问题的行号;

2.无需更改代码就能开启或者关闭。如果已经结束开发,同时已经排除了所有bug,仅需使用宏定义

#define NDEBUG
将其放在包含assert.h的位置前面,重新编译程序,编译器即会禁用文件中的所有assert()语句。而需要再次调试时,移除即可。

程序2:

#include <stdio.h>
#define NDEBUG
#include <assert.h>

int main(int argc, char* argv[]) {
    printf("Hello World\n");

    assert(3 > 2);

    printf("Hi zj\n");

    int x = 3;
    assert(x != 3);

    printf("over\n");

    return 0;
}




我们也可以自定义类似assert()宏

程序3:

#include <stdio.h>
#include <stdlib.h>
//#define NDEBUG
#include <assert.h>

//#define _DEBUG

#ifndef _DEBUG
#define Asert(exp, message) if (!(exp))  {  printf("Assertion failed: %s\n", #exp); \
        printf("Message: %s\n",  message); \
        printf("line: %d\n", __LINE__); \
        printf("file: %s\n", __FILE__); \
        exit(EXIT_FAILURE); \
    }
#else
#define Asert(exp, message)
#endif

int main(int argc, char* argv[]) {
    printf("Hello World\n");

    assert(3 > 2);

    printf("Hi zj\n");

    int x = 3;
    Asert(x != 3, "Hi, i'm here");

    printf("over\n");

    return 0;
}



当结束调试后,使用宏定义

#define _DEBUG
即可关闭信息输出


程序4:

#include <stdio.h>
#include <stdlib.h>
//#define NDEBUG
#include <assert.h>

#define _DEBUG

#ifndef _DEBUG
#define Asert(exp, message) if (!(exp))  {  printf("Assertion failed: %s\n", #exp); \
        printf("Message: %s\n",  message); \
        printf("line: %d\n", __LINE__); \
        printf("file: %s\n", __FILE__); \
        exit(EXIT_FAILURE); \
    }
#else
#define Asert(exp, message)
#endif

int main(int argc, char* argv[]) {
    printf("Hello World\n");

    assert(3 > 2);

    printf("Hi zj\n");

    int x = 3;
    Asert(x != 3, "Hi, i'm here");

    printf("over\n");

    return 0;
}



自定义断言的好处:

1)新增参数,例如新增一个消息参数,使得 assert 宏输出更为丰富的信息。

2)改变 assert 的行为内容。C 标准库中的 assert 宏将中断程序,实际上,我们可以让程序继续运行而不中断或者进入调试状态等,另外还可以控制消息输出的目标,即控制消息是输出到控制台还是文本文件,甚至是通过网络发出。(百度百科)



在C11标准中,还新增了一个特性:可以在编译时检查断言表达式

#if defined __USE_ISOC11 && !defined __cplusplus
/* Static assertion.  Requires support in the compiler.  */
# undef static_assert
# define static_assert _Static_assert
#endif

之前的assert()都是在运行时进行检查,而使用static_assert宏可以在编译时就进行检查


由上面可知,使用static_assert或者_Static_assert都可以

static_assert接受两个参数,第1个参数要求是整型常量表达式,第2个参数是一个字符串。

当第一个表达式求值为0(或_False),编译器会显示字符串,并且结束编译。



程序5:

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

int main(int argc, char* argv[])
{
	static_assert('a' == 4, "a != 4");
	static_assert(sizeof(int) < sizeof(char),
	             "this program requires that int is less than char"); // compile-time error

	return 0;
}



程序6:

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

int main(int argc, char* argv[])
{
	static_assert(4 == 4, "a != 4");
	static_assert(sizeof(int) == sizeof(float),
	             "this program requires that int is less than char"); // compile-time error

	printf("Hello World\n");
	printf("sizeof(int): %ld\n", sizeof(int));
	printf("sizeof(float): %ld\n", sizeof(float));

	return 0;
}


程序8:

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

int main(int argc, char* argv[])
{
	int x = 4;
	static_assert(x == 4, "x != 4");

	printf("Hello World\n");

	return 0;
}


第一个参数必须是整型常量表达式,上面这个是整型变量表达式



################################################


C++中assert使用

默认支持c++11


参考:

assert.h - http://baike.baidu.com/link?url=0ZjMM4537IyI35TU4UJdCHpvfgdKw7F0fxDPbIfJszRNgGJEqbQkfX3cqC-nIjJIEeFdb0x1ygOy15Pdjmkc4q

Static Assertion - http://en.cppreference.com/w/cpp/language/static_assert

assert - http://en.cppreference.com/w/cpp/error/assert



头文件:

#include <cassert>

宏定义assert()用法和C中一样


程序9:

#include <iostream>
#include <cassert>
using namespace std;

int main(int argc, char* argv[]) {
    cout <<"Hello World\n";

    assert(3 > 2);

    cout <<"Hi zj\n";

    int x = 3;
    assert(x != 3);

    cout <<"over\n";

    return 0;
}


好像输出内容更详细



同样可以自定义assert宏以及编译时检查assert


######################################################################


java中assert用法


参考:

Java陷阱之assert关键字 - http://lavasoft.blog.51cto.com/62575/43735/

理解和正确使用Java中的断言(assert) - http://blog.csdn.net/leichelle/article/details/7951321/


#######################################################################


assert的使用场所:

1)在程序开始时检查输入参数;

2)在函数调用后检查有效的输出;

3)检查任何自我觉得需要检查的对象。


##########################################################################


abort的使用


参考:

abort - http://baike.baidu.com/link?url=G5xiDjCdURJQnDFn_bbQyGyiKa-i5vdaLIJVv5ySittgZv0utH1jNqjJJpWcuT-gBROgCDJ9OtUfXSIBCjL4eK

abort - http://en.cppreference.com/w/c/program/abort


功能:导致异常程序终止


C头文件:

#include <stdlib.h>

例程:

#include <stdio.h>
#include <stdlib.h>
 
int main(void) 
{
    FILE *fp = fopen("data.txt","r");
    if (fp == NULL) {
       fprintf(stderr, "error opening file data.txt in function main()\n");
       abort();
    }
 
    /* Normal processing continues here. */
    fclose(fp);
    printf("Normal Return\n");
    return 0;
}


C++头文件:

#include <cstdlib>


参考:

std::abort - http://en.cppreference.com/w/cpp/utility/program/abort


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值