Да, стандарт допускает это, и да, имя, которое вы создаете таким образом, видно только внутри функции (т. Е. Оно имеет локальную область, так же, как при определении int i;
, i
имеет локальную область).
Чаще всего это делают примерно так:
typedef struct {
/* ... */
} B;
B b;