Я видел исходные коды, всегда имеющие определение типа для структуры и использующие то же везде вместо того, чтобы использовать имя структуры в качестве "структуры sname" и т.д. непосредственно?
Какова причина позади этого? Есть ли какие-либо преимущества в выполнении этого?
Легче читать Блок b;
, чем struct boxtype b;
typedef struct _entry{
char *name;
int id;
} Entry, *EntryP;
Преимущество:
В приведенном выше typedef
, оба Entry
и EntryP
определены отдельно от struct _entry
.
Итак, EntryP firstentry
можно использовать вместо struct _entry * firstentry
, и это немного проще для анализа.
Примечание: это не похоже на имена структур , которые должны быть typedef
ined, но, очевидно, их легче читать. Кроме того, использование Entry *
по сравнению с EntryP
полностью зависит от пользователя.
Это просто для удобства чтения кода. typedefs просто задают новое имя для типа данных. Вместо того, чтобы указывать int везде, где вы можете назвать его так, как хотите, и где бы вы ни использовали int, вы можете просто заменить его новым именем, которое вы дали. То же самое относится и к конструкциям.
Имя структуры, не определяемой типом, в C требует добавления слова "struct" везде используется имя типа, поэтому большинство людей используют typedef для создания нового имени для типа, которому не нужно постоянно добавлять ключевое слово struct.
Причины для этого - удобочитаемость кода, ограниченная типизация и, вероятно, ясность, но определения типов могут фактически скрыть информацию о типах указателей.
Честно говоря, необходимость typedef для создания новых имен для структур - пережиток, и очень жаль, что C99 не последовал примеру C ++ и не удалил его.
Это странная особенность языка 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
является непрозрачным типом (т.е. я могу передавать только указатели на него) во всем моем коде, кроме кода, реализующего его операции, который может видеть, как он на самом деле определен. (Можно использовать отдельное имя для непрозрачного типа, но в этом нет никакого реального преимущества)
На самом деле я не использую typedef для структур.
Почему?
Потому что я бы в любом случае использовал какое-то соглашение, такое как префикс s_
, чтобы легко увидеть, на какую переменную я смотрю.
Поскольку я использую много абстрактных типов данных, я думаю, было бы неплохо использовать typedef, чтобы пользователь действительно использовал его как непрозрачный тип. Но на практике я всегда использую struct в реализации в любом случае.
Это форма сокрытия информации, полезная при создании непрозрачных типов. См. эту ссылку SO для более подробного ответа.