Подтвердить что ты не робот

Если я делаю `typedef` в C или С++, когда мне следует добавить` _t` в конце typedef'ed типа?

Я запутался, когда следует добавить конечные _t to typedef 'ed типы?

Например, должен ли я сделать это:

typedef struct image image_t;

или это:

typedef struct image image;

Каковы общие правила?

Другой пример: должен ли я сделать это:

typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;

или это:

typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;

Пожалуйста, просветите меня.

Спасибо, Бода Сидо.

4b9b3361

Ответ 1

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

Ответ 2

Я лично презираю соглашение _t. До тех пор, пока вы последовательны, это действительно не имеет значения.

Обратите внимание, что (как указывают другие ответы здесь), если вы кодируете какой-либо другой стандарт, например POSIX, вам нужно проверить, хорошо ли это в этом стандарте перед использованием таких имен.

Ответ 3

Когда следует использовать _t? Никогда? Он зарезервирован по основному стандарту (POSIX), и даже если это не так, ваш код может когда-нибудь использоваться в среде POSIX, поэтому использование _t - плохая идея.

Я хотел бы далее сказать, что чрезмерное использование typedef плохое в целом. Если ваш тип struct, union или enum, используйте эти ключевые слова, когда вы объявляете переменные, и это делает ваш код более понятным. Использование typedef лучше всего зарезервировано для того, чтобы сделать основной тип невидимым для целей абстрагирования/инкапсуляции. Несколько отличных примеров из стандарта C: size_t, int32_t, mbstate_t и stdio FILE.

Некоторые из худших злоупотреблений typedef относятся к Windows API (WORD, DWORD, INT, LPSTR и т.д.) и glib (gint, gchar и т.д.)., Создание дубликатов стандартных типов C с таким же предполагаемым использованием является только запутанным и служит для блокировки разработчиков в вашей библиотеке/платформе, загрязняя весь код этими нестандартными именами типов.

Ответ 4

Я использую суффиксы для повышения удобочитаемости: _t для typedef и _e для перечислений с 25/30 лет... иногда я использую _st, когда typedef определяет структуру.

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

Старый stdio.h содержит _t... См. grep -i "_t;" stdio.h:) Я думаю, что стандарт POSIX "немного" моложе, чем C!

Ответ 5

Я использую суффикс _t для перечислений и примитивных типов, чтобы отличать их от переменных. Я помещаю их в пространства имен, поэтому мне не нужно резервировать _t.

Чтобы оправдать это. Очень часто переменное имя представляет собой намек на типизированный тип. Как std::size_t size;, array_t array и т.д. Я обнаружил, что легче подобрать достойное имя для переменной, когда тип содержит суффикс _t. Это также напоминает мне, что это типизированный примитив, а не какой-то другой зверь, например, класс.

Ответ 6

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

Кстати: typedef image image; не имеет никакого смысла, так как он просто делает образ typedef для себя.