typedef 数组
最近看到 sigsetjmp siglongjmp 的代码,musl 里对 jmp_buf 的写法很独特。原来 C 里面还是有好多东西自己不知道的啊。
typedef unsigned long __jmp_buf[22];
typedef struct __jmp_buf_tag {
__jmp_buf __jb;
unsigned long __fl;
unsigned long __ss[128/sizeof(long)];
} jmp_buf[1];
typedef jmp_buf sigjmp_buf;
上面的代码是 setjmp.h 里的定义,把一个 struct 类型定义成一个数组。第一次看有点让人疑惑。
#include <stdio.h>
typedef char STR[1024];
int main()
{
STR a = "1234";
printf("%s\n", a);
return 0;
}
- 我们再来看下数组作为函数参数的情况,下面三种写法是等价的,数组名会被当成指针传递。
void myFunction(int *param);
void myFunction(int param[]);
void myFunction(int param[10]);
综合上面两点,我们再看 jmp_buf 的声明,可以看到它是长度为1,struct __jmp_buf_tag 类型数组的别名。
它的好处是这样的:
- 在声明
jmp_buf 的时候,可以把数据分配到堆栈上。 - 作为参数传递的时候则作为一个指针。
sigjmp_buf env_buf;
sigsetjmp siglongjmp
int sigsetjmp(sigjmp_buf env, int savemask);
综上其中一种用法如下:
...
sigjmp_buf env;
func()
{
...
siglongjmp(env, 1);
}
if (sigsetjmp(env, 1) == 0) {
do_sth();
} else {
do_sth_else();
}
...