-
Notifications
You must be signed in to change notification settings - Fork 3
/
1-typedefs.c
86 lines (76 loc) · 1.15 KB
/
1-typedefs.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
//Plain struct decl
struct Foo_s {
int a;
int b;
};
//inline typedef
typedef struct Bar_s {
int a;
int b;
} Bar_t,
*Bar_p; //now, with pointers!
//Declaration, followed by typedef
struct Baz_s {
int a;
int b;
};
typedef struct Baz_s Baz_t;
//Typedef anonymous struct
typedef struct {
int a;
Baz_t b;
} Quux_t;
void
part1(void)
{
//Inline population
struct Foo_s foo = { .a = 7, .b = 9 };
Bar_t bar = { 8, 8 };
Bar_p pBar = &bar;
Quux_t q = {
.a = 22,
//Nesting designated initializer
.b = {
.a = 1,
.b = 2,
}
};
#if 0
//Invalid
Baz_t baz = (Baz_t) bar;
#else
//Pointer aliasing (dangerous)
Baz_t baz = *(Baz_t *)&bar;
#endif
printf("foo: %d %d\n", foo.a, foo.b);
printf("bar: %d %d\n", bar.a, bar.b);
printf("baz: %d %d\n", baz.a, baz.b);
}
//How about casts?
typedef int mile;
typedef int meter;
typedef struct Miles_s {
int x;
} Miles_t;
typedef struct Meter_s {
int x;
} Meter_t;
void
part2(void)
{
meter a = 19;
//It doesn't complain about the type switches!
mile b = a;
#if 0
Meter_t c = { 19 };
Miles_t d = c; //invalid!
#endif
}
int
main(int argc, char **argv)
{
part1();
part2();
return 0;
}