Это просто синтаксис ...
C - довольно старый язык, и он намеренно создал синтаксис, который различает типизированные, которые могут быть представлены непосредственно машинными инструкциями, и те, которые являются более сложными и занимают несколько областей памяти.
«Typedef» был добавлен в язык, чтобы разрешить создание более коротких имен, которые не включали структуру, однако используется полный синтаксис структуры - и, в частности, используется в историческом контексте, где исходное определение структуры системы определяется как "struct" без соответствующей краткой формы typedef.
В качестве сравнения C ++, который является гораздо более поздним языком, позволяет ссылаться на класс / структуру только по имени класса / структуры независимо от того, был ли он определен с помощью typedef.
Итак, когда возникают вопросы, ответ таков: просто так, потому что это ...
EDIT : просто глядя на ваш пример кода, есть один примечательный случай, когда struct добавляет что-то к поведению компилятора - в большинстве случаев тип должен быть определен до того, как его можно будет использовать в другом объявление - за исключением случаев, когда вы ссылаетесь на struct sometype*
(то есть указатель на структуру), и в этом случае компилятор с радостью определит sometype
после использования.
так
struct post {
struct post *nextpost;
struct post *prevpost;
...
};
становится возможным, поскольку post
не определено до закрывающей скобки структуры.