参考:
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 断言库
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
参考:
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://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