/* Example 1, tagless */

#define mystruct1 struct { int x; }

/* 'foo1' and 'bar1' have the same type.  'baz1' does not */
mystruct1 foo1, bar1;
mystruct1 baz1;

/* Example 2, with a tag */

struct tag2 { int x; };
#define mystruct2 struct tag2

/* 'foo2', 'bar2', 'baz2' all have the same type */
mystruct2 foo2, bar2;
mystruct2 baz2;

/* Example 3, tagless, but with a typedef */

typedef struct { int x; } mystruct3;

/* 'foo3', 'bar3', 'baz3' all have the same type */
mystruct3 foo3, bar3;
mystruct3 baz3;

/* Example 4, with a tag and with a typedef */

typedef struct tag4 { int x; } mystruct4;

/* 'foo4', 'bar4', 'baz4' all have the same type */
mystruct4 foo4, bar4;
mystruct4 baz4;

int main(void) { return 0; }