C库头文件提供<stdlib.h>两个不是相当完美的程序函数:abort与exit.
abort: 这是默认的程序结束函数,这种方式可能会或可能不会以刷新与关闭打开的文件
或删除临时文件,这与你的设计有关.
exit: 附加了关闭打开文件与返回状态码给执行环境,并调用你用atexit注册的返回函数
示例:
#include <stdlib.h>
#include <stdio.h>
static void atexit_handler_1(void)
{
printf("within 'atexit_handler_1'\n");
}
static void atexit_handler_2(void)
{
printf("within 'atexit_handler_2'\n");
}
int main()
{
atexit(atexit_handler_1);
atexit(atexit_handler_2);
exit(EXIT_SUCCESS);
printf("This line shoul never appear!\n");
return 0;
}
但是在程序中我们更希望有条件地结束程序,这就用到的了诊断工具:assert宏
assert宏在<assert.h>中的定义如下:
#if defined NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) _assert((condition), #condition, _FILE_,_LINE_)
#endif
但是assert宏的实现并不唯一,在VC6.0中如下:
#define assert(exp) (void)((exp)(_assert(#exp,_FILE_,_LINE_),0));
Borland C++5.5:
#define assert(exp) ((exp)?(void)0: _assert(#exp,_FILE_,_LINE_))
我们要经常使用assert,这样可能更容易地进行维护程序,但是要注意,assert宏
只在Debug版本里面才有效,在Release版本里不起任何作用,所以不要在assert
宏里进行任何实质性的运算,如 assert(++i != 0); 这样的代码绝对不能出现在程序
中的,因为Debug和Release的结果是完全不一样的.assert 宏常用的方式如下:
static voif f(char *p)
{
assert(p!=NULL);
......
}
abort(),exit()和assert()
最新推荐文章于 2024-09-11 21:11:31 发布