关于struct的一些用法

结构的自引用

 2 如下形式是非法的:
 3 struct SELF_REF1{
 4     int a;
 5     struct SELF_REF1 b;
 6     int c;
 7 };
 8 由于b是一个完整的结构,但其内部还将包含它自己的成员b, 以上形式会导致无穷递归,因此是非法的。
 9
10 如下形式是合法的:
11
12 struct SELF_REF2{
13     int a;
14     struct SELF_REF1 *b;
15     int c;
16 };
17
18 这两个声明的区别在于:
19 现在的b是一个指针而不是一个结构。指针的长度在结构的长度确定之前就可以确定。
20
21 下面的声明会出错:
22 typedef struct{
23     int a;
24     A b;
25     int c;
26 }A;
27
28 解决的办法:
29 typedef struct _A{
30     int a;
31     _A b;
32     int c;
33 }A;
34

 

不完整的声明:


36 偶尔,你必须声明一些相互之间存在依赖的结构。也就是说,两个结构之间相互包含,所谓“你中有我,我中有你”,但哪个结构应该先声明呢?
37 这个问题的解决方案就是不完整声明:
38
39 struct B;
40
41 struct A{
42     struct B;
43     int a;
44 };
45
46 struct B{
47     struct A;
48     int b;
49 };
50


位段(bit field)

 

52 使用结构体有实现位段的能力,但注重可移植性和程序应该避免使用位段。
53
54 如下是一个位段的例子:
55
56 struct CHAR{
57     unsigned ch   :7;
58     unsigned font :6;
59     unsigned size :19;
60 };
61
62 struct CHAR ch1;
63 ch1.ch = 0x1;
64 ch1.font = 0x1;
65 ch1.font = 0x1;
66 /*ch1: 0000_0000_0000_0000_0010_0000_1000_0001*/
67 具体实现方式还得看处理理是大端还是小端。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值