Почему имена структур должны иметь определение типа? - PullRequest
9 голосов
/ 09 апреля 2010

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

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

Ответы [ 7 ]

10 голосов
/ 09 апреля 2010

Его легче читать 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 ined, но, очевидно, его легче читать. Кроме того, использование Entry * против EntryP полностью зависит от пользователя.

4 голосов
/ 09 апреля 2010

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

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

3 голосов
/ 09 апреля 2010

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

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

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

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

2 голосов
/ 09 апреля 2010

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

1 голос
/ 09 апреля 2010

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

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

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

1 голос
/ 09 апреля 2010

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

0 голосов
/ 09 апреля 2010

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

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

...