/* GCC y la alineación de campos en unions
 * Ernesto Hernández-Novich <emhn@usb.ve>
 * CI3641 Lenguajes de Programación I
 */

#include <stdio.h>
#include <stddef.h>

typedef struct yin {
  int    foo;
  double bar;
  int    baz; 
} yin;

typedef struct yang {
  double qux;
  _Bool  meh;
  char   grok[3];
} yang;

typedef struct zen {
  _Bool  begin;
  union  {
    yin   white;
    yang  black;
  };
  _Bool  end;
} zen;

#define OFF(t,f) printf("\toffset(%s) = %d\n","f",offsetof(t,f));

void main(int argc,char **argv) {
  zen master;

  printf("sizeof(master) = %d\n", sizeof(master));
  printf("Offsets\nBegin:\n");
  OFF(zen,begin);
  printf("Yin:\n");
  OFF(zen,white.foo);
  OFF(zen,white.bar);
  OFF(zen,white.baz);
  printf("Yang:\n");
  OFF(zen,black.qux);
  OFF(zen,black.meh);
  OFF(zen,black.grok);
  printf("End:\n");
  OFF(zen,end);
}