结构的自引用
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 具体实现方式还得看处理理是大端还是小端。