¿Son legales los declaradores anónimos en Ansi C?

Asumo que algo como este reparto es legal (donde foo es un puntero para anular):

struct on_off { unsigned light : 1; unsigned toaster : 1; int count; /* 4 bytes */ unsigned ac : 4; unsigned : 4; unsigned clock : 1; unsigned : 0; unsigned flag : 1; }; ((on_off) foo).count = 3; 

Pero me pregunto si la estructura no está definida si algo como esto es legal:

 ((struct { unsigned light : 1; unsigned toaster : 1; int count; /* 4 bytes */ unsigned ac : 4; unsigned : 4; unsigned clock : 1; unsigned : 0; unsigned flag : 1; }) foo).count = 3; 

… o algo por el estilo.

¡Gracias!

Sí, C permite el casting a estructuras anónimas. Aquí está una demostración rápida:

 struct xxx { int a; }; ... // Declare a "real"struct, and assign its field struct xxx x; xa = 123; // Cast a pointer of 'x' to void* void *y = &x; // Access a field of 'x' by casting to an anonymous struct int b = ((struct {int a;}*)y)->a; printf("%d\n", b); // Prints 123 

Demo en ideone .