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
- C/C++/Java 断言assert使用
- C/C++assert 断言
- Linux C 中断言assert()使用简介
- Linux C 中断言assert()使用简介
- c++assert断言
- C/C++ Assert 断言
- C-断言(assert)
- 【c++】assert断言
- C语言断言assert详解
- 立此存照(13)[C++]C++中的assert断言使用示例
- c语言——面试之assert断言使用
- java 断言 assert 初步使用:断言开启、断言使用
- java 断言 assert 初步使用:断言开启、断言使用
- java 断言 assert 初步使用:断言开启、断言使用
- java 断言 assert 初步使用:断言开启、断言使用
- java 断言 assert 初步使用:断言开启、断言使用
- java 断言 assert 初步使用:断言开启、断言使用
- java 断言 assert 初步使用:断言开启、断言使用
- django 1.8文档代码
- metropolis准则函数
- Asteroids(二分图的最大匹配)
- win32之Hello World
- 一次非典型SQL优化:如何通过业务逻辑优化另辟蹊径?
- C/C++/Java 断言assert使用
- Windows+Retina+Photoshop 显示页面太小
- Volley 源码解析
- weka中的arff格式数据
- 写一些必要的书籍和想看的书籍。
- 支持向量机基础之核函数
- 常见对象_StringBuffer的截取功能
- Linux编译nc
- 包