Почему у структурных имен есть typedef?

Я видел, что исходные коды всегда имеют typedef для структуры и используют одно и то же везде, а не напрямую используют имя структуры как «struct sname» и т. Д.?

В чем причина этого? Есть ли какие-либо преимущества в этом?

Его легче читать Box b; чем struct boxtype b;

 typedef struct _entry{ char *name; int id; } Entry, *EntryP; 

Преимущество:
В приведенном выше typedef как Entry и EntryP определяются отдельно от struct _entry .
Таким образом, EntryP firstentry можно использовать вместо struct _entry *firstentry и немного проще разбирать в уме.

Примечание. Его не похожие названия структуры должны быть typedef , но, видимо, их легче читать. Кроме того, использование Entry * vs EntryP полностью зависит от пользователя.

Это нечетная причуда на языке C, имена тегов структуры хранятся в другом пространстве имен (таблица символов). Язык C ++ избавился от этого поведения. Typedef создает псевдоним для типа структуры в глобальном пространстве имен. Поэтому вам не нужно вводить «struct» перед именем структуры.

Не уверенный, что курил Ритчи, когда он определил это поведение. Я предполагаю какую-то проблему с парсером в ранней версии компилятора.

Мне нравится делать это в C:

 // in a "public" header file typedef struct Example Example; // in a "private" header or a source file struct Example { ... }; 

Подобно этому, у меня есть Example как непрозрачный тип (т. Е. Я могу передавать только указатели на него) по всему моему коду, за исключением кода, который реализует его операции, который может видеть, что он действительно определен как. (Вы можете использовать отдельное имя для непрозрачного типа, но для этого нет никакого реального преимущества.)

Его просто для чтения кода. typedefs – это просто дать новое имя для типа данных. Вместо того чтобы давать int, где вы можете назвать его так, как вы хотите, и где бы вы ни использовали, вы можете просто заменить его новым именем, которое вы указали. То же самое относится и к структурам.

Это форма скрытия информации и полезно при создании непрозрачных типов. См. Эту ссылку SO для получения более длинного ответа.

Неструктурированное имя структуры в C требует, чтобы «struct» всегда была добавлена ​​везде, где используется имя типа, поэтому большинство людей используют typedef для создания нового имени для типа, в котором не требуется, чтобы ключевое слово struct было добавлено все время.

Причинами этого являются читаемость кода, сокращенная типизация и, возможно, ясность, но typedefs могут фактически заслонять информацию о типах указателей.

Честно говоря, необходимость typedef для создания новых имен для структур является реликвией, и стыдно, что C99 не следовал примеру C ++ и удалял ее.

На самом деле я не использую typedef для structs. Зачем? Потому что в любом случае я бы использовал какой-то условный префикс s_ , чтобы легко увидеть, какую переменную я ищу.

Поскольку я использую много абстрактных типов данных, я думаю, было бы неплохо использовать typedef, так что пользователь действительно использует его как непрозрачный тип. Но на практике я всегда использую структуру в реализации.