Ale*_*ica 95 c struct typedef reverse-engineering declaration
我正在窥探我的MSP430微控制器的头文件,我遇到了这个<setjmp.h>:
/* r3 does not have to be saved */
typedef struct
{
uint32_t __j_pc; /* return address */
uint32_t __j_sp; /* r1 stack pointer */
uint32_t __j_sr; /* r2 status register */
uint32_t __j_r4;
uint32_t __j_r5;
uint32_t __j_r6;
uint32_t __j_r7;
uint32_t __j_r8;
uint32_t __j_r9;
uint32_t __j_r10;
uint32_t __j_r11;
} jmp_buf[1]; /* size = 20 bytes */
Run Code Online (Sandbox Code Playgroud)
我知道它声明了一个匿名结构和typedef它jmp_buf,但我无法弄清楚它是什么[1].我知道它声明jmp_buf是一个有一个成员(这个匿名结构)的数组,但我无法想象它用于什么.有任何想法吗?
Sha*_*ger 113
这是在C中创建"引用类型"的常见技巧,其中将其用作函数参数会导致单个元素数组降级为指向其第一个元素的指针,而程序员无需显式地使用&运算符来获取其地址.在声明的地方,它是一个真正的堆栈类型(不需要动态分配),但是当作为参数传递时,被调用的函数接收指向它的指针,而不是副本,因此它被廉价地传递(并且如果没有被调用的函数可以突变)const).
GMP在其mpz_t类型中使用相同的技巧,并且它在那里至关重要,因为该结构管理指向动态分配的内存的指针; 该mpz_init函数依赖于获取指向结构的指针,而不是它的副本,或者它根本无法初始化它.类似地,许多操作可以调整动态分配的内存的大小,如果它们不能改变调用者的结构,则无法工作.