Почему с помощью определения типа *после* определение структуры?

Оба этих стиля:

struct _something
{
   ...
};
typedef struct _something someting;

и тот стиль:

typedef struct _something
{
  ...
} something;

корректные объявления определения типа в C.
Обратите внимание, что присутствие описания структуры в заголовочном файле сделано нарочно: у Меня должен быть доступ к внутренним компонентам структуры где-то в другом месте.

Один недостаток первого объявления состоит в том, что при использовании любого IDE автоматический "переход к объявлению" часто направляет Вас к typedef struct _something someting; вместо того, чтобы дать Вам непосредственно реальное определение структуры.

Во втором методе Вы добираетесь непосредственно до определения структуры.

Существует ли причина, почему можно было бы использовать первый метод?
Код я продолжаю работать, полон их...
Это - просто плохая/хорошая привычка от специалистов по обслуживанию?

12
задан Gui13 30 July 2010 в 13:00
поделиться

6 ответов

Эта ветка обсуждения дает хороший обзор темы и подчеркивает важную причину использования первого стиля:

Этот стиль разделяет определение типа (которое не что делает typedef) из создания синонима typename (что равно то, что typedef делает), и сохраняет строгое соответствие между именем типа и синонимом типа без недостаток использования одного и того же имени для обоих (что может запутать некоторых отладчики, и в любом случае это боль для grep).

3
ответ дан 2 December 2019 в 22:37
поделиться

Есть одно очевидное преимущество разделения typedef и объявления структуры, и это преимущество очевидно, если вы разделяете их в разных файлах. Это позволяет инкапсулировать данные.

Вы объявляете в заголовочном файле вашу

typedef struct whatever typename;

Это объявление типа struct любой , не зная, как это реализовано. Теперь вы можете объявить функции, которые являются частью интерфейса, не раскрывая ничего из внутренней структуры структуры. Все, что нужно, - это передать указатель на это typename .

В файле реализации вашего «класса» (я заключил это в кавычки, поскольку мы говорим здесь исключительно в контексте C) вы делаете следующее:

#include "header.h"

struct whatever {
  ...
  ...
  /* can even contain references to `struct whatever` or even `typename` */
};

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

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

Нет технической причины выбирать между двумя способами типизации структуры.

Некоторые люди, возможно, используют первый способ, потому что они изучали объявления типов и структур отдельно и просто не совмещают их. Или, возможно, их IDE предпочитает другую форму.

Или, возможно, стиль кодирования был выбран по прихоти до появления мощных IDE.

1
ответ дан 2 December 2019 в 22:37
поделиться

Если вы разделите эти две вещи (typedef от объявления struct), вы сможете, если потребуется, иметь непрозрачные указатели.

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

Читайте также ответ @tristopia.

1
ответ дан 2 December 2019 в 22:37
поделиться

, когда вы определяете структуру:

struct something
{
   ...
};

Вы создали новый тип под названием «struct something».

Вы можете использовать это в своем приложении, например:

struct something myvar;

Но большинству людей не нравится вводить struct (особенно с большим количеством указателей):

struct something *test = (struct something*)malloc(sizeof(struct something))

Поэтому вместо этого вы вводите ее (в любом случае, как вы описали):

struct something
{
   ...
};
typedef struct _something someting;

или

typedef struct _something
{
  ...
} something;

Таким образом, когда вы используете структуру, вы можете сделать это:

something *test = (something*)malloc(sizeof(something))

Насколько вы ее определяете, это не имеет значения.

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

0
ответ дан 2 December 2019 в 22:37
поделиться

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

0
ответ дан 2 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

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