看书时发现一个语句jmp_buf kansa;
这个jmp_buf是什么呢?搜到这篇文章https://blog.csdn.net/freezlz/article/details/50812293。看这篇文章中,又发现了语句1
typedef struct __jmp_buf_tag jmp_buf[1];
那么这是个啥呢,发现__jmp_buf_tag是个struct,下一个疑问是类似于这样的语法1
typedef struct SomeStruct someName[1]
是什么意思呢?于是写代码顺着编译器出错提示进行修改,了解到这是设定了一个数组的别名。代码如下1
2
3
4
5
6
7
8
9
10struct A {
int i;
};
typedef struct A B[5];
int main()
{
B b; // 一个长度是5的数组,每一项的类型是A
b[4].i = 50;
std::cout << b[0].i << " " << b[4].i << std::endl;
}
于是了解到jmp_buf是一个可以用来定义一个长度为1的数组,数组类型是__jmp_buf_tag
jmp_buf是用来干什么的呢?继续看资料,看了这篇文章https://www.cnblogs.com/hbiner/p/3261437.html后,总结如下:
1,jmp_buf通常是作为参数用在setjmp和longjmp函数中;
2,setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回0值;
3,longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值;
4,通常它们用在异常处理,有点类似于java的try catch;
5,C++中longjmp()调出某个作用域时,它不会调用对象的析构函数。C++标准中也讲使用longjmp()跳出某个作用域而且这个作用域的栈中有某个对象需要析构时,程序行为是不确定的。