最近在看jpeg编解码相关的知识,opencv在jpeg编解码上调用的是libjpeg,于是决定读一读libjpeg的源码,涨一涨姿势水平,发现一些新奇的东西(毕竟菜鸡),记录下来。
c++/java中的异常处理,try catch大家想必都非常了解了,那么c语言中如何实现异常处理呢,c语言提供了setjmp和longjmp两个函数供大家使用,这里简单介绍一下
int setjmp(jmp_buf envbuf);
void longjmp(jmp_buf envbuf, int val);
函数原型如上所示,setjmp 初次调用时会返回0,而longjmp调用时则会调转到setjmp调用的位置(setjmp时由jmp_buf记录堆栈信息,从而longjmp时能找到当时的堆栈位置),并且longjmp指定的第二个参数val会作为调转至setjmp处的返回值
下面看一个简单的例子大家就明白啦:
这是一个java的例子
try {
doLogic();
} catch(Excpetion1 e) {
doError1();
} catch(Excpetion2 e) {
doError2();
}
那么c如何实现呢
jmp_buf buf;
int error_code = setjmp(buf);
if(error_code == 1) {
doError1();
}
else if(error_code == 2) {
doError2();
}
doLogic();//如果内部出错则调用longjmp(buf, error_code)