Почему имена структуры должны иметь определение типа?

Я видел исходные коды, всегда имеющие определение типа для структуры и использующие то же везде вместо того, чтобы использовать имя структуры в качестве "структуры sname" и т.д. непосредственно?

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

9
задан N 1.1 11 April 2010 в 21:12
поделиться

7 ответов

Легче читать Блок 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 полностью зависит от пользователя.

10
ответ дан 4 December 2019 в 10:03
поделиться

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

2
ответ дан 4 December 2019 в 10:03
поделиться

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

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

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

1
ответ дан 4 December 2019 в 10:03
поделиться

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

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

4
ответ дан 4 December 2019 в 10:03
поделиться

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

// in a "public" header file
typedef struct Example Example;

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

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

.
3
ответ дан 4 December 2019 в 10:03
поделиться

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

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

0
ответ дан 4 December 2019 в 10:03
поделиться

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

1
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: