Обсуждение подготовлено в предположении, что интересующим языком является C. Разветвления для C ++ не рассматривались.
Использование указателя typedef для структуры без тегов
Вопрос Размер структуры, определяемой как указатель , вызывает интересную информацию об использовании typedef
для (структуры) указателей.
Рассмотрим определение типа бетонной (не непрозрачной) конструкции без тега:
typedef struct { int field1; double field2; } *Information;
Подробности членов абсолютно касаются этого обсуждения; все, что имеет значение, - то, что это не непрозрачный тип, такой как typedef struct tag *tag;
(и вы не можете определить такие непрозрачные типы через typedef
без тега).
Возникает вопрос: «Как узнать размер этой структуры?»
Краткий ответ: «только через переменную типа». Нет тега для использования с sizeof(struct tag)
. Например, вы не можете писать sizeof(*Information)
, а sizeof(Information *)
- это размер указателя на тип указателя, а не размер типа структуры.
Фактически, если вы хотите выделить такую структуру, вы не можете создать ее, за исключением динамического выделения (или суррогатных методов, которые имитируют динамическое распределение). Нет никакого способа создать локальную переменную типа структуры, указатели которой называются Information
, а также нет способа создать переменную области видимости файла (глобальную или static
) типа структуры, а также нет способа внедрить такую структуру (в отличие от указателя на такую структуру) в другую структуру или тип объединения.
Вы можете - должны - написать:
Information info = malloc(sizeof(*info));
Помимо того, что указатель скрыт в typedef
, это хорошая практика - если тип info
изменится, распределение по размеру останется точным. Но в этом случае это также единственный способ получить размер структуры и выделить структуру. И нет другого способа создать экземпляр структуры.
Это вредно?
Это зависит от ваших целей.
Это не непрозрачный тип - детали структуры должны быть определены, когда тип указателя typedef
'd.
Это тип, который может использоваться только с динамическим распределением памяти.
Это тип безымянный. Указатель на тип структуры имеет имя, а сам тип структуры - нет.
Если вы хотите задействовать динамическое распределение, похоже, это способ сделать это.
В целом, однако, это скорее вызывает замешательство и беспокойство, чем просветление.
Резюме
Как правило, плохая идея использовать typedef
для определения указателя на тип структуры без тега.