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

来源:互联网 发布:凸包问题数据 编辑:程序博客网 时间:2024/05/22 09:04

参考:

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.  */#ifdefNDEBUG# 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)#endifint 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)#endifint 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 errorreturn 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 errorprintf("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
原创粉丝点击