Структурная путаница в C

Поэтому я просмотрел этот учебник по C и нашел эти строки кода:

struct Monster { Object proto; int hit_points; }; typedef struct Monster Monster; 

И я подумал, что это будет иметь больший смысл, если бы это было так:

 typedef struct { Object proto; int hit_points; } Monster; 

Я мог бы быть совершенно неправ, потому что я очень новичок в C, но я бы предположил, что оба эти кода будут делать то же самое. Так и есть, тогда есть ли какая-то причина предпочитать одну над другой? Или, если они разные, что их отличает? Спасибо!

Бывают случаи, когда вторая форма не будет работать. Предположим, вы хотите создать связанный список Monster s. В первой форме вы можете добавить указатель на следующий Monster в struct .

 struct Monster { Object proto; int hit_points; struct Monster* next; }; 

Вы не можете сделать это во второй форме, так как struct не имеет имени.

Первый fragment кода определяет тип struct Monster , а затем дает ему другое имя Monster .

Вторая часть кода определяет структуру без тега, а typedef – как Monster .

С помощью любого кода вы можете использовать Monster как тип. Но только в первом коде вы также можете использовать struct Monster .

Определения (из первой части вопроса – плюс мое либеральное переформирование):

 struct Monster { Object proto; int hit_points; }; typedef struct Monster Monster; 

Эквивалентно:

 typedef struct Monster { Object proto; int hit_points; } Monster; 

Мои предпочтения:

 typedef struct MONSTER_S { Object proto; int hit_points; } MONSTER_T; 

FYI … имя структуры не требуется. Так что, если код нужен только для использования этого типа, то это также хорошо:

 typedef struct { Object proto; int hit_points; } MONSTER_T;