用exit()函数可以退出程序并将控制权返回给 *** 作系统,而用return语句可以从一个函数中返回并将控制权返回给调用该函数的函数。如果在main()函数中加入return语句,那么在执行这条语句后将退出main()函数并将控制权返回给 *** 作系统,这样的一条return语句和exit()函数的作用是相同的。下例是一个使用了exit()函数和return语句的程序:
#include <stdio.h>
#include <stdlib.h>
int main (int, char** )
int do_processing (void)
int do_something_daring()
int main (int argc, char** argv)
{
int ret_code
if (argc <3)
{
printf ("Wrong number of arguments used ! \n")
/* return 1 to the operating system * /
exit(1)
}
ret_code = do_processing ()
......
/* return 0 to the operating system * /
exit(0)
}
int do_processing(void)
{
int rc
rc = do_aomcthing_daring()
if (rc == ERROR)
{
printf ("Something fiahy ia going on around here... *\n)
/* return rc to the operating syatem * /
exit (re)
}
/* return 0 to the calling function * /
return 0
}
在上例的main()函数中,如果argc小于3,程序就会退出。语句“exit(1)”指示程序在退出时将数字1返回给 *** 作系统。 *** 作系统有时会根据程序的返回值进行一些相关的 *** 作,例如许多DOS批处理文件会通过一个名为ERRORLEVEL的全局变量来检查可执行程序的返回值。
这个用C实现的异常处理的关键函数是setjmp和longjmp,setjmp函数可以实现非局部标号,而longjmp实现程序内部的任意跳转(与之类似的我们经常使用的goto只能实现函数内部的跳转)。这两个函数的相互组合使用,百度百科给了如下总结:1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。
2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)
通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。
我封装的异常处理库也是按照上面总结的方法使用的,理解了上面的总结再看代码就非常简单了。
在需要抛出异常的地方使用Throw宏抛出异常,它两个参数,一个是异常类型,一个是异常说明字符串。也可以使用ThrowAll来抛出一个任意类型的异常,但是此时只能使用Except才能捕获。
将可能出现异常的代码段使用Try包含起来。OnExcept用来捕获异常,它有一个参数,标记需要捕获什么类型的异常。如果此时有异常产生,异常类型与OnExcept要捕获的类型一致能会捕获到这个异常,否则抛弃。而如果使用Except宏则会捕获任意类型的异常。
最后需要调用Finally宏来进行清理,包括释放在Try宏内申请的内存空间。
一个简单的使用例子如下:
[cpp] view plaincopyprint?
#include <stdio.h>
#include <excp.h>
void fun(void* p){
if(p == NULL) Throw(1, "这个指针是空的呀!!!")
else printf("神马都是浮云!/n")
}
int main(){
void* p = NULL
Try{
fun(p)
}
OnException(1){
printf("%s/n", Message)
}
Finally{
printf("这个指针是空的我有啥用呀?/n")
}
return 0
}
[cpp] view plaincopyprint?
#include <stdio.h>
#include <excp.h>
void fun(void* p){
if(p == NULL) Throw(1, "这个指针是空的呀!!!")
else printf("神马都是浮云!/n")
}
int main(){
void* p = NULL
Try{
fun(p)
}
OnException(1){
printf("%s/n", Message)
}
Finally{
printf("这个指针是空的我有啥用呀?/n")
}
return 0
}
文章知识点与官方知识档案匹配
C技能树首页概览
108976 人正在系统学习中
点
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)