C

由来:

最近在看《the Linux Programming Interface》。发现一个以前从未注意到的问题:setjmp函数的原型如下:

int setjmp(sigjmp_buf env);

此函数是用来保存当前局部一些数据,方便之后longjmp跳转到此的。令我不解的是,此sigjmp_buf看名字不是指针类型,那其怎么修改env内的值。

带着这疑问,我clone了glibc的仓库,发现其类型定义如下:

struct __jmp_buf_tag                                                                                                                                                
{                                                                                                                                                                 
    /* NOTE: The machine-dependent definitions of `__sigsetjmp'                                                                                                     
       assume that a `jmp_buf' begins with a `__jmp_buf' and that                                                                                                   
       `__mask_was_saved' follows it.  Do not move these members                                                                                                    
       or add others before it.  */                                                                                                                                 
    __jmp_buf __jmpbuf;     /* Calling environment.  */                                                                                                             
    int __mask_was_saved;   /* Saved the signal mask?  */                                                                                                           
    __sigset_t __saved_mask;    /* Saved signal mask.  */                                                                                                           
};                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                
typedef struct __jmp_buf_tag jmp_buf[1];
typedef struct __jmp_buf_tag sigjmp_buf[1];

尽管我自认足智多谋:),但我一开始压根没搞懂这两个typedef是啥意思(贴出sigjum_buf的是因为让大家明白这两个在glibc里是一个类型)。

于是我写了个小程序测试一下,发现此类型定义的变量类似指针类型(->能用YCM补全,.不能)。再写了个会报错的程序,gcc报其是struct __jmp_buf_tag[1]。

然后经过一分钟的思考,我明白了这是啥玩意。这就是个长度为1的__jmp_buf_tag结构数组类型。

总结一下typedef的经验,将最后一个未声明字符串(此处为jmp_buf)去掉,再去掉typedef,就是这种新类型的类型。

后言:

由于这只写了一点,所以我不好意思给此随笔另取个名字。打算以后发现什么稀罕的关于C的事都写这了。

转载于:https://www.cnblogs.com/algorithmchangeworld/p/7768170.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值