Ответ 1
struct name_of_struct
однозначно ссылается на тег struct
/class
name_of_struct
тогда как name_of_struct
может быть переменной или именем функции.
Например, в POSIX у вас есть и struct stat
и функция с именем stat
. Когда вы хотите сослаться на тип struct, вам необходимо ключевое слово struct
для устранения неоднозначности (+ plain C требует этого всегда - в обычном C обычные идентификаторы живут в отдельном пространстве имен из тегов struct, а теги struct не проникают в обычные пространство имен идентификаторов, как в C++, если вы явно не перетаскиваете их туда с помощью typedef, как в typedef struct tag{/*...*/} tag;
).
struct foo{ char x [256];};
void (*foo)(void);
int structsz(){ return sizeof(struct foo); } //returns 256
int ptrsz(){ return sizeof(foo); } //returns typically 8 or 4
Если это кажется сбивающим с толку, оно в основном существует для обеспечения обратной совместимости с C.