177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// struct definition and declaration
277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct a {
377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    int a;
477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    int b;
577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} c;
677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Useful anonymous struct declaration
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct {
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    int y;
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} anon1, anon2;
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// forward declarations
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct a;
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct b;
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct c;
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct b {int a; int b; };
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// struct c {b g; }; // syntax error.
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// struct s {float c,a,b,c;} s; // duplicate struct member
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct c {struct b g; };
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// struct a { int w; }; // error
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid testCopying() {
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    struct a {int a[10]; char c;} a, b;
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    a.c = 37;
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    b.c = 38;
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    b = a;
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    printf("testCopying: %d == %d\n", a.c, b.c);
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid testUnion() {
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    union u;
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    union u {float f;int i;} u;
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    u.f = 1.0f;
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    printf("testUnion: %g == 0x%08x\n", u.f, u.i);
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostruct v {float x, y, z, w; };
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid add(struct v* result, struct v* a, struct v* b) {
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    result->x = a->x + b->x;
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    result->y = a->y + b->y;
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    result->z = a->z + b->z;
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    result->w = a->w + b->w;
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid set(struct v* v, float x, float y, float z, float w) {
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    v->x = x;
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    v->y = y;
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    v->z = z;
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    v->w = w;
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid print(struct v* v) {
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    printf("(%g, %g, %g, %g)\n", v->x, v->y, v->z, v->w);
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid testArgs() {
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    struct v a, b, c;
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    set(&a, 1.0f, 2.0f, 3.0f, 4.0f);
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    set(&b, 5.0f, 6.0f, 7.0f, 8.0f);
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    add(&c, &a, &b);
6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    printf("testArgs: ");
6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    print(&c);
6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint main() {
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    anon1.y = 3;
7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    anon2.y = anon1.y;
7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    testCopying();
7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    testUnion();
7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    testArgs();
7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    struct c cc;
8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    cc.g.a = 3;
8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    c.a = 1;
8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    c.b = 3;
8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    struct a {int x, y; } z;
8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    // struct a {int x, y; } z2;
8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    z.x = c.a;
8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    struct a *pA;
8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    pA = &z;
8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    pA->x += 5;
8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return pA->x;
9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
91